Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah maksudnya php tidak menyokong unicode?

Apakah maksudnya php tidak menyokong unicode?

藏色散人
藏色散人asal
2021-07-27 09:35:522689semak imbas

php tidak menyokong unicode, yang bermaksud bahawa rentetan PHP tidak menyimpan maklumat pengekodan aksara, jadi fungsi operasi asli tidak mengetahui cara data binari sepadan dengan teks, dan hanya boleh menganggap bahawa satu aksara sepadan dengan bait tunggal; dengan cara ini, apabila memproses Ia mencukupi untuk kod Bahasa Inggeris dan ASCII lain, tetapi untuk aksara berbilang bait seperti bahasa Cina, ralat akan berlaku.

Apakah maksudnya php tidak menyokong unicode?

Persekitaran pengendalian artikel ini: sistem Windows 7, PHP versi 7.1, komputer DELL G3

Apakah maksudnya php tidak menyokong unicode? Mengapakah ia mengatakan bahawa PHP tidak menyokong pengekodan Unicode?

Selalunya dikatakan PHP tidak menyokong Unicode, atau PHP tidak menyokong Unicode di peringkat bawah. Walaupun saya tahu bahawa pengekodan PHP sangat menyakitkan dan pelbagai fungsi pemprosesan rentetan adalah sangat tidak standard, ia masih boleh memaparkan bahasa Cina. Saya tidak pernah memahami maksud ia tidak menyokong Unicode. Menghabiskan sedikit masa menyusun maklumat ini.

Mari kita mulakan dengan contoh:

Skrip PHP adalah seperti berikut di atas, Nampaknya satu aksara Cina dianggap sebagai 3 aksara. Ini bermula dengan penyimpanan rentetan PHP.

//文件编码UTF-8
echo strlen("中文"); // 6
echo substr("中文",0,1) // 乱码
echo substr("中文",0,3) // 中
Saya meringkaskannya seperti berikut:

Rentetan PHP terdiri daripada tatasusunan bait. Dalam erti kata lain, sama dengan bahasa C char a[3] = "abc", satu aksara menduduki satu bait.

Selain itu, tiada maklumat pengekodan untuk menyimpan teks, yang bermaksud bahawa PHP tidak tahu pengekodan data binari rentetan ini harus sepadan.

Selain itu, PHP akan menentukan pengekodan rentetan mengikut pengekodan fail skrip. Contohnya: $string = "Chinese";, jika fail skrip ialah UTF-8, pengekodan UTF-8 Cina: E4B8ADE69687 akan disimpan.

Selain itu, seperti yang dinyatakan sebelum ini, PHP tidak menyimpan maklumat pengekodan rentetan. Jadi walaupun orang Cina disimpan sebagai: E4B8ADE69687, dari perspektif fungsi asal rentetan, ia hanyalah rentetan nombor binari. Oleh itu, fungsi rentetan asli PHP hanya boleh beroperasi pada aksara bait tunggal! Hanya layan bait sebagai watak!

Jika anda telah memahami perkara di atas, contoh kod di atas secara semula jadi akan difahami:

Begitu juga, jika anda menukar pengekodan fail kepada GBK atau lain-lain, anda akan dapat percubaan sekali lagi Keputusan yang sama diperolehi, kecuali setiap aksara Cina dalam GBK menduduki 2 bait.

//文件编码UTF-8
echo bin2hex("中文"); // 可以看到,"中文"对应的二进制就是:e4b8ade69687
echo strlen("中文"); // 所以按照单字节来统计长度,就是6 
echo substr("中文",0,1) // 取0到1个字节,也就是e4,并不对应某个字符的编码,所以乱码
echo substr("中文",0,3) // 取0到3个字节,刚好把`中`的编码取出来
Jadi sekarang, anda pada dasarnya boleh memahami apa lapisan bawah PHP tidak menyokong unicode Ringkasannya adalah seperti berikut:

Rentetan PHP tidak menyimpan maklumat pengekodan aksara, jadi asli Fungsi pengendalian tidak mengetahui bagaimana data binari sepadan dengan teks, dan hanya boleh [menganggap] bahawa satu aksara sepadan dengan satu bait. Ini mencukupi apabila memproses kod Bahasa Inggeris dan ASCII lain, tetapi untuk bahasa Cina dan [aksara berbilang bait] lain, ralat akan berlaku.

Sebaliknya, kita boleh melihat apa yang dipanggil bahasa asas yang menyokong Unicode:

Anda boleh melihat bahawa dalam JS, berbilang perkataan boleh dikenali dan diproses dengan betul watak bahagian. Maksudnya, semasa menyimpan, maklumat pengekodan teks juga disimpan. (Tekaan saya di sini ialah nilai Unicode teks disimpan, tetapi saya tidak pasti kerana saya tidak memahami prinsip asas JS)

var string = "中文"
console.log(string.length); // 2
string.substr(0,1) // 中
Kemudian ada soalan di sini, bagaimana boleh multi-bait aksara diproses dengan betul dalam PHP? Jawapannya ialah sambungan mbstring (untuk butiran, lihat: http://php.net/manual/zh/book.mbstring.php). Apa yang dipanggil mbstring ialah: rentetan berbilang bait, rentetan berbilang bait.

Dalam set sambungan ini, terdapat satu siri fungsi yang sepadan dengan fungsi rentetan asli, yang boleh digunakan untuk mengendalikan aksara berbilang bait dengan betul. Contohnya: strlen sepadan dengan mb_strlen... Antara fungsi yang sepadan ini, ia pada asasnya sama dengan fungsi asli, kecuali ia biasanya mempunyai parameter pilihan tambahan: pengekodan.

Contohnya:

Pembelajaran yang disyorkan: "

Tutorial Video PHP
// 脚本类型为UTF-8
echo strlen("中文"); // 6
echo mb_strlen("中文","UTF-8"); //2  使用mb_strlen ,并传入编码 utf-8, 就会把二进制E4B8ADE69687当做utf-8的处理能正确处理
echo mb_strlen("中文"); //2  如果不传编码UTF-8,则函数会自动确定编码,文档说:如果省略,则使用内部字符编码。所以这里也当做UTF-8来处理。
echo mb_strlen("中文","GBK"); //3,如果传入编码GBK,则:e4b8ade69687会被当做gbk来处理,一个gbk字符占2字节,所以为:3
"

Atas ialah kandungan terperinci Apakah maksudnya php tidak menyokong unicode?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn