To pytanie wygląda żenująco prosto, ale nie udało mi się znaleźć odpowiedzi.
Jaki jest odpowiednik PHP dla następującego wiersza kodu C #?
string str = "\u1000";
Ten przykład tworzy ciąg z pojedynczym znakiem Unicode, którego „Wartość liczbowa Unicode” wynosi 1000 szesnastkowo (4096 dziesiętnie).
To znaczy, w jaki sposób w PHP mogę utworzyć ciąg z pojedynczym znakiem Unicode, którego „wartość liczbowa Unicode” jest znana?
Odpowiedzi:
Ponieważ JSON bezpośrednio obsługuje
\uxxxx
składnię, pierwszą rzeczą, która przychodzi mi do głowy, jest:Inną opcją byłoby użycie
mb_convert_encoding()
lub skorzystaj z bezpośredniego mapowania między UTF-16BE (big endian) a punktem kodowym Unicode:
źródło
\uxxxx
składnię Unicode, dzięki czemu możnajson_decode
pracować nad sztucznie utworzoną reprezentacją ciągu JSON. Zmieniłem jednak sformułowanie, aby to wyjaśnić.echo json_decode('\u201B');
Który odnosi się do pojedynczego cofniętego cytatu Jednak to nie działa, co oznacza brak wyjścia (nawet jeśli jest przesyłane dohd
)echo json_decode('"\u201B"');
. Podwójne cudzysłowy wokół symbolu Unicode są obowiązkowe.W PHP 7.0.0 wprowadzono składnię „ucieczki punktu kodowego Unicode” .
Teraz można łatwo pisać znaki Unicode, używając podwójnego cudzysłowu lub ciągu heredoc , bez wywoływania żadnej funkcji.
źródło
wordwrap($longLongText, 20, "\u{200B}", true);
( jest to przestrzeń o zerowej szerokości )Zastanawiam się, dlaczego nikt jeszcze o tym nie wspomniał, ale możesz zrobić prawie równoważną wersję, używając sekwencji ucieczki w podwójnych cudzysłowach :
Przykład ASCII:
Więc w twoim przypadku wszystko, co musisz zrobić, to
$str = "\x30\xA2";
. Ale to są bajty , a nie znaki. Bajtowa reprezentacja punktu kodowego Unicode pokrywa się z big endianem UTF-16, więc możemy wydrukować go bezpośrednio jako taki:Jeśli używasz innego kodowania, będziesz musiał odpowiednio zmienić bajty (głównie za pomocą biblioteki, choć jest to również możliwe ręcznie).
Przykład Little Endian UTF-16:
Przykład UTF-8:
Jest też
pack
funkcja, ale można się spodziewać, że będzie działać wolno.źródło
PHP nie zna tych sekwencji ucieczki Unicode. Ale ponieważ nieznane sekwencje specjalne pozostają nienaruszone, możesz napisać własną funkcję, która konwertuje takie sekwencje specjalne Unicode:
Lub z anonimowym wyrażeniem funkcyjnym zamiast
create_function
:Jego użycie:
źródło
To też działa. Jednak rozwiązanie json_decode () jest dużo szybsze (około 50 razy).
źródło
Wypróbuj Portable UTF-8 :
Wszystkie działają dokładnie tak samo. Możesz uzyskać kod znaku za pomocą
utf8_ord()
. Przeczytaj więcej o Portable UTF-8 .źródło
Jak wspominali inni, PHP 7 bezpośrednio wprowadza obsługę
\u
składni Unicode.Jak również wspominali inni, jedynym sposobem na uzyskanie wartości ciągu z dowolnego sensownego opisu znaku Unicode w PHP jest przekonwertowanie go z czegoś innego (np. Parsowanie JSON, parsowanie HTML lub inna forma). Ale wiąże się to z kosztem wydajności w czasie wykonywania.
Jest jednak jeszcze jedna opcja. Możesz kodować znak bezpośrednio w PHP za pomocą
\x
binarnych znaków ucieczki.\x
Składnia ucieczka jest również obsługiwana w PHP 5 .Jest to szczególnie przydatne, jeśli nie chcesz wprowadzać znaku bezpośrednio w ciągu w jego naturalnej formie. Na przykład, jeśli jest to niewidoczny znak sterujący lub inny trudny do wykrycia biały znak.
Najpierw przykład dowodu:
Zauważ, że jak wspomniał Pacerier w innej odpowiedzi, ten kod binarny jest unikalny dla określonego kodowania znaków. W powyższym przykładzie
\xE2\x80\x8A
jest kodowanie binarne dla U + 200A w UTF-8.Następne pytanie brzmi: jak dostać się z
U+200A
do\xE2\x80\x8A
?Poniżej znajduje się skrypt PHP do generowania sekwencji ucieczki dla dowolnego znaku na podstawie ciągu JSON, encji HTML lub dowolnej innej metody, gdy masz ją jako natywny ciąg.
źródło
$ msg = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';
echo unicode_to_textstring ($ str);
źródło