Pertanyaan ini terlihat sangat memalukan, tetapi saya belum dapat menemukan jawaban.
Berapakah nilai PHP yang setara dengan baris kode C # berikut?
string str = "\u1000";
Sampel ini membuat string dengan karakter Unicode tunggal yang "nilai numerik Unicode" adalah 1000 dalam heksadesimal (4096 dalam desimal).
Yaitu, di PHP, bagaimana saya bisa membuat string dengan karakter Unicode tunggal yang "nilai numerik Unicode" diketahui?
Jawaban:
Karena JSON secara langsung mendukung
\uxxxx
sintaks, hal pertama yang muncul di pikiran saya adalah:Pilihan lain adalah menggunakan
mb_convert_encoding()
atau manfaatkan pemetaan langsung antara UTF-16BE (big endian) dan titik kode Unicode:
sumber
\uxxxx
sintaks Unicode sehingga Anda dapat menggunakannyajson_decode
untuk bekerja pada representasi string JSON yang dibuat secara artifisial. Saya mengubah kata-katanya untuk diklarifikasi.echo json_decode('\u201B');
Yang merujuk pada satu kutipan yang dikembalikan Namun tidak berfungsi, artinya tidak ada output (bahkan jika disalurkan kehd
)echo json_decode('"\u201B"');
. Kutipan ganda di sekitar simbol unicode adalah wajib.PHP 7.0.0 telah memperkenalkan sintaks "Unicode codepoint escape" .
Sekarang dimungkinkan untuk menulis karakter Unicode dengan mudah dengan menggunakan string yang dikutip ganda atau heredoc , tanpa memanggil fungsi apa pun.
sumber
wordwrap($longLongText, 20, "\u{200B}", true);
( ruang nol-lebar itu)Saya bertanya-tanya mengapa belum ada yang menyebutkan ini, tetapi Anda dapat melakukan versi yang hampir setara menggunakan urutan melarikan diri dalam string dikutip ganda :
Contoh ASCII:
Jadi untuk kasus Anda, yang perlu Anda lakukan adalah
$str = "\x30\xA2";
. Tapi ini byte , bukan karakter. Representasi byte dari Unicode codepoint bertepatan dengan UTF-16 big endian, jadi kita bisa mencetaknya secara langsung seperti:Jika Anda menggunakan penyandian yang berbeda, Anda harus mengubah byte yang sesuai (kebanyakan dilakukan dengan pustaka, meskipun mungkin dengan tangan juga).
UTF-16 contoh kecil endian:
Contoh UTF-8:
Ada juga
pack
fungsinya, tetapi Anda bisa mengharapkannya lambat.sumber
PHP tidak tahu urutan pelepasan Unicode ini. Tetapi karena urutan pelarian yang tidak diketahui tetap tidak terpengaruh, Anda dapat menulis fungsi Anda sendiri yang mengubah urutan pelarian Unicode tersebut:
Atau dengan ekspresi fungsi anonim alih-alih
create_function
:Penggunaannya:
sumber
Ini juga berfungsi. Namun solusi json_decode () jauh lebih cepat (sekitar 50 kali).
sumber
Coba Portable UTF-8 :
Semua bekerja dengan cara yang persis sama. Anda bisa mendapatkan codepoint karakter dengan
utf8_ord()
. Baca lebih lanjut tentang Portable UTF-8 .sumber
Seperti yang disebutkan oleh yang lain, PHP 7 memperkenalkan dukungan untuk
\u
sintaks Unicode secara langsung.Seperti yang juga disebutkan oleh orang lain, satu-satunya cara untuk mendapatkan nilai string dari deskripsi karakter Unicode yang masuk akal di PHP, adalah dengan mengonversinya dari sesuatu yang lain (mis. Parsing JSON, parsing HTML atau bentuk lain). Tetapi ini datang dengan biaya kinerja run-time.
Namun, ada satu opsi lain. Anda dapat menyandikan karakter secara langsung di PHP dengan
\x
binary escaping. The\x
sintaks melarikan diri juga didukung dalam PHP 5 .Ini sangat berguna jika Anda memilih untuk tidak memasukkan karakter secara langsung dalam string melalui bentuk aslinya. Misalnya, jika itu adalah karakter kontrol yang tidak terlihat, atau sulit lainnya untuk mendeteksi spasi putih.
Pertama, contoh bukti:
Perhatikan bahwa, seperti yang disebutkan oleh Pacerier dalam jawaban lain, kode biner ini unik untuk pengkodean karakter tertentu. Dalam contoh di atas,
\xE2\x80\x8A
adalah pengkodean biner untuk U + 200A di UTF-8.Pertanyaan berikutnya adalah, bagaimana Anda dapatkan dari
U+200A
ke\xE2\x80\x8A
?Di bawah ini adalah skrip PHP untuk menghasilkan urutan escape untuk setiap karakter, berdasarkan pada string JSON, entitas HTML, atau metode lain setelah Anda memilikinya sebagai string asli.
sumber
$ msg = '67714eac99c500200054006f006b0079006f002000530074006100740069006f006e003a0020';
echo unicode_to_textstring ($ str);
sumber