Sentiasa gunakan pengekodan UTF-8
P粉548512637
2023-07-24 19:47:11
<p>
Saya sedang menyediakan pelayan baharu dan mahukan sokongan penuh UTF-8 dalam aplikasi web saya. Saya telah mencuba ini sebelum ini pada pelayan sedia ada, tetapi selalu nampaknya perlu kembali kepada ISO-8859-1. <br />Di manakah saya perlu menetapkan pengekodan/set aksara? Saya tahu saya perlu mengkonfigurasi Apache, MySQL dan PHP untuk mencapai ini. Adakah terdapat senarai semak standard yang boleh saya rujuk atau selesaikan masalah ketidakpadanan? <br />Ini ialah pelayan Linux baharu yang menjalankan MySQL 5, PHP 5 dan Apache 2. <br /></p><p><br /></p>
Saya ingin menambah jawapan terbaik chazomaticus:
Juga jangan lupa tag META (seperti ini, atau versi HTML4 atau XHTML):
Ini mungkin kelihatan remeh, tetapi IE7 telah memberi saya masalah sebelum ini.
Saya melakukan semuanya dengan betul; pangkalan data, sambungan pangkalan data dan pengepala HTTP Jenis Kandungan semuanya ditetapkan kepada UTF-8 dan berfungsi dengan baik dalam semua penyemak imbas lain, tetapi Internet Explorer masih berkeras untuk menggunakan pengekodan "Eropah Barat".
Ternyata page tersebut tiada tag META. Selepas menambahnya, masalah telah diselesaikan.
Sunting:
W3C sebenarnya mempunyai bahagian yang cukup besar khusus untuk isu pengantarabangsaan (I18N). Mereka mempunyai beberapa artikel yang berkaitan dengan isu ini, meliputi HTTP, (X)HTML dan CSS:
Mereka mengesyorkan menggunakan pengepala HTTP dan teg meta HTML (atau menggunakan pengisytiharan XML dalam XHTML yang disediakan sebagai XML).
Storan Data:
Nyatakan set aksara utf8mb4 pada semua jadual dan lajur teks dalam pangkalan data. Dengan cara ini, MySQL akan menyimpan dan mendapatkan semula nilai secara fizikal dalam pengekodan asalnya UTF-8. Ambil perhatian bahawa jika pengumpulan utf8mb4_* ditentukan (tanpa set aksara eksplisit), MySQL secara tersirat akan menggunakan pengekodan utf8mb4.
Dalam versi MySQL yang lebih lama (
Akses data:
Dalam kod aplikasi anda (cth. PHP), tidak kira kaedah akses pangkalan data yang anda gunakan, anda perlu menetapkan set aksara sambungan kepada utf8mb4. Dengan cara ini, apabila MySQL menghantar data ke aplikasi anda, ia tidak melakukan sebarang penukaran daripada UTF-8 asalnya dan sebaliknya.
Sesetengah pemandu menyediakan mekanisme mereka sendiri untuk mengkonfigurasi set aksara sambungan, yang kedua-duanya mengemas kini keadaan dalamannya sendiri dan memaklumkan MySQL tentang pengekodan untuk digunakan pada sambungan - ini biasanya pendekatan pilihan. Dalam PHP:
Jika anda menggunakan lapisan abstraksi PDO untuk PHP ≥ 5.3.6, anda boleh menentukan set aksara dalam DSN:
Jika anda menggunakan mysqli, anda boleh memanggil set_charset():
Jika anda hanya boleh menggunakan fungsi mysql biasa, tetapi menjalankan PHP ≥ 5.2.3, anda boleh memanggil kaedah mysql_set_charset.
Jika pemandu tidak menyediakan mekanismenya sendiri untuk menetapkan set aksara sambungan, anda mungkin perlu mengeluarkan pertanyaan untuk memberitahu MySQL bagaimana aplikasi anda mahu data pada sambungan dikodkan: SET NAMA 'utf8mb4'.
Pertimbangan yang sama seperti di atas digunakan untuk utf8mb4/utf8.
Output:
Input:
Nota kod lain:
Jelas sekali, semua fail yang anda berikan (PHP, HTML, JavaScript, dll.) hendaklah dikodkan dalam UTF-8 yang sah.
Anda perlu memastikan bahawa setiap kali anda mengendalikan rentetan UTF-8 ia selamat. Malangnya, ini adalah bahagian yang paling sukar. Anda mungkin perlu menggunakan sambungan mbstring PHP secara meluas.
Operasi rentetan terbina dalam PHP tidak menyokong UTF-8 secara lalai. Terdapat beberapa operasi rentetan PHP biasa yang boleh anda gunakan dengan selamat (seperti penggabungan), tetapi untuk kebanyakan operasi anda harus menggunakan fungsi mbstring yang setara.
Untuk mengetahui apa yang anda lakukan (iaitu tidak kacau), anda benar-benar perlu memahami UTF-8 dan cara ia berfungsi pada tahap yang paling rendah. Semak mana-mana pautan di utf8.com yang menyediakan beberapa sumber hebat untuk mempelajari semua yang anda perlu ketahui.