2012-02-20 7 views
25

Czy można wprowadzić znak i odzyskać wartość Unicode? na przykład, mogę umieścić & # 12103 w html na wyjściu "⽇", czy można nadać temu znakowi argument jako argument funkcji i uzyskać numer jako wynik bez budowania tabeli unicode?Czy mogę uzyskać wartość Unicode postaci lub vice versa za pomocą php?

$val = someFunction("⽇");//returns 12103 

lub do tyłu?

$val2 = someOtherFunction(12103);//returns "⽇" 

Chciałbym móc wyjściu rzeczywiste znaki na nie stronie kodów, i chciałbym również, aby móc dostać kod z charakterem, jeśli to możliwe. Najbliżej dostałem to, czego chcę, to php.net/manual/en/function.mb-decode-numericentity.php, ale nie mogę go uruchomić, czy jest to kod, którego potrzebuję, czy jestem na niewłaściwym torze?

Odpowiedz

27
function _uniord($c) { 
    if (ord($c{0}) >=0 && ord($c{0}) <= 127) 
     return ord($c{0}); 
    if (ord($c{0}) >= 192 && ord($c{0}) <= 223) 
     return (ord($c{0})-192)*64 + (ord($c{1})-128); 
    if (ord($c{0}) >= 224 && ord($c{0}) <= 239) 
     return (ord($c{0})-224)*4096 + (ord($c{1})-128)*64 + (ord($c{2})-128); 
    if (ord($c{0}) >= 240 && ord($c{0}) <= 247) 
     return (ord($c{0})-240)*262144 + (ord($c{1})-128)*4096 + (ord($c{2})-128)*64 + (ord($c{3})-128); 
    if (ord($c{0}) >= 248 && ord($c{0}) <= 251) 
     return (ord($c{0})-248)*16777216 + (ord($c{1})-128)*262144 + (ord($c{2})-128)*4096 + (ord($c{3})-128)*64 + (ord($c{4})-128); 
    if (ord($c{0}) >= 252 && ord($c{0}) <= 253) 
     return (ord($c{0})-252)*1073741824 + (ord($c{1})-128)*16777216 + (ord($c{2})-128)*262144 + (ord($c{3})-128)*4096 + (ord($c{4})-128)*64 + (ord($c{5})-128); 
    if (ord($c{0}) >= 254 && ord($c{0}) <= 255) // error 
     return FALSE; 
    return 0; 
} // function _uniord() 

i

function _unichr($o) { 
    if (function_exists('mb_convert_encoding')) { 
     return mb_convert_encoding('&#'.intval($o).';', 'UTF-8', 'HTML-ENTITIES'); 
    } else { 
     return chr(intval($o)); 
    } 
} // function _unichr() 
+0

Hi Mark, Dzięki za kod. Czy to jest gdzieś online z wyjaśnieniem, jak to działa? – Totoro

+0

Jest to kod, którego używam w PHPExcel; ale nie mogę sobie przypomnieć, skąd go otrzymałem od tej pory, ani znaleźć odniesienia do jego źródła ... ale jest on używany w wielu bibliotekach –

+1

Pierwsza funkcja pobiera ciąg znaków (znak Unicode składa się z kilku oktetów), sprawdza pierwsze bity pierwszego oktetu, aby dowiedzieć się długości znaku w oktetach (myślę, że używa on UTF8). Następnie usuwa bity kontrolne z każdego oktetu i zamienia pozostałe bity (tworzące sam znak Unicode) na żądany numer. Ta konwersja jest prosta, po prostu zamieniając całkowitą na ciąg. –

3

można korzystać z następujących funkcji

Do kodowania

string utf8_encode (string $data) 

http://php.net/manual/en/function.utf8-encode.php

przypadku dekodowania

string utf8_decode (string $data) 

http://php.net/manual/en/function.utf8-decode.php

Sprawdź również

http://php.net/manual/en/function.htmlspecialchars.php

<?php 


echo htmlspecialchars_decode("&#12103");//will print ⽇ 

?> 
+1

cześć Akhil, patrzyłem na te, ale działają tylko ze znakami ASCII, wszystko powyżej staje się bełkotem. – Totoro

+0

Pls sprawdź moją edycję i zobacz, czy jej przydatne –

+0

cześć @Akhil, dziękuję, działa, wstyd, nie ma opcji kodowania. – Totoro

8

To również działa (dla kogoś, kto rozumie bitshifting to może być bardziej czytelny niż Mark Bakers odpowiedź):

public function ordinal($str){ 
    $charString = mb_substr($str, 0, 1, 'utf-8'); 
    $size = strlen($charString);   
    $ordinal = ord($charString[0]) & (0xFF >> $size); 
    //Merge other characters into the value 
    for($i = 1; $i < $size; $i++){ 
     $ordinal = $ordinal << 6 | (ord($charString[$i]) & 127); 
    } 
    return $ordinal; 
} 
+0

Witam, przetestowałem twoją odpowiedź na Marks i myślę, że jest problem z twoją (ponieważ nie jestem dobra z przesunięciem bitów nie wiem co). echo "

" .ordinal ("響"). "::" ._uniord ("響"). "

"; Powraca: 105: 38911 (powinno być 38911) – Totoro

+0

Witam, dziękuję za odpowiedź. Błąd wydaje się być w domyślnym kodowaniu mb_internal_encoding(), jeśli to nie jest "utf-8", pobieranie pierwszego znaku nie powiedzie się. Naprawiłem to przez jawne dodanie kodowania do mb_substr. – user23127

+0

Głosowałem nad tym, jak działa teraz, ale pozostawi odpowiedź taką, jaka była. Dzięki za alternatywę – Totoro

18

Oto bardziej kompaktowy realizacja unichr/uniord podstawie pack:

// code point to UTF-8 string 
function unichr($i) { 
    return iconv('UCS-4LE', 'UTF-8', pack('V', $i)); 
} 

// UTF-8 string to code point 
function uniord($s) { 
    return unpack('V', iconv('UTF-8', 'UCS-4LE', $s))[1]; 
} 
+0

Więzienie zerwanie ...: D – kupendra

0

Jeśli używasz PHP7.2 (lub później), nie ma potrzeby, aby zdefiniować nową funkcję; istnieją dwie funkcje dla twoich celów z rozszerzenia Multibyte String/library!

Aby uzyskać punkt kodowy znaku (tj. Wartość Unicode), należy użyć mb_chr(); i aby uzyskać konkretną postać z tej wartości, użyj mb_ord().

Np .:

mb_chr(12103, "utf8"); // ⽇ 
mb_ord("⽇", "utf8"); // 12103 
Powiązane problemy