Sentiasa gunakan UTF-8
P粉964682904
2023-08-27 16:00:18
<p>
Saya sedang menyediakan pelayan baharu dan mahukan sokongan penuh UTF-8 dalam aplikasi web saya. Saya telah mencuba ini pada masa lalu pada pelayan sedia ada, tetapi selalu nampaknya terpaksa kembali ke ISO-8859-1. </p>
<p>Di manakah sebenarnya saya perlu menetapkan pengekodan/set aksara? Saya tahu saya perlu mengkonfigurasi Apache, MySQL dan PHP untuk melakukan ini - adakah terdapat beberapa senarai semak standard yang boleh saya ikuti, atau mungkin menyelesaikan masalah di mana ketidakpadanan berlaku? </p>
<p>Ini terpakai kepada pelayan Linux baharu yang menjalankan MySQL 5, PHP, 5 dan Apache 2. </p>
Saya ingin menambah satu perkara kepada jawapan yang sangat baik 一个>chazomaticus:
Juga jangan lupa teg META (seperti ini, atau versi HTML4 atau XHTMLnya):
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, yang berfungsi dengan baik dalam semua penyemak imbas lain, tetapi Internet Explorer masih berkeras untuk menggunakan pengekodan "Eropah Barat".
Ternyata halaman tersebut tiada tag META. Menambahnya menyelesaikan masalah.
Editor:
W3C sebenarnya mempunyai bahagian yang cukup besar khusus untuk I18N. Mereka mempunyai beberapa artikel yang berkaitan dengan isu ini - menerangkan aspek HTTP, (X)HTML dan CSS:
Mereka mengesyorkan menggunakan pengepala HTTP dan teg meta HTML (atau pengisytiharan XML dalam kes XHTML bertindak sebagai XML).
Storan Data:
Nyatakan
utf8mb4
character set on all tables and text columns in your database. This makes MySQL physically store and retrieve values encoded natively in UTF-8. Note that MySQL will implicitly useutf8mb4
encoding if autf8mb4_*
himpunan ditentukan (tanpa set aksara eksplisit).Dalam versi lama MySQL (< 5.5.3), malangnya anda akan terpaksa menggunakan
utf8
, yang hanya menyokong subset aksara Unicode.Akses Data:
Dalam kod aplikasi anda (cth. PHP), dalam apa jua kaedah akses DB yang anda gunakan, anda perlu menetapkan set aksara sambungan kepada
utf8mb4
Dengan cara ini, MySQL tidak melakukan penukaran daripada UTF-8 asalnya apabila ia menyerahkan data kepada permohonan anda 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 dengan PHP ≥ 5.3.6, anda boleh tentukan
charset
dalam DSN:Jika anda menggunakan mysqli, anda boleh menghubungi
set_charset()
:Jika anda terjebak dengan plain mysql tetapi kebetulan menjalankan PHP ≥ 5.2.3, anda boleh menghubungi
mysql_set_charset
.Jika pemandu tidak menyediakan mekanisme sendiri untuk menetapkan set aksara sambungan, anda mungkin perlu mengeluarkan pertanyaan untuk memberitahu MySQL bagaimana aplikasi anda menjangkakan data pada sambungan akan dikodkan:
SET NAMES 'utf8mb4'
.Pertimbangan yang sama berkenaan
terpakai seperti di atas.utf8mb4
/utf8
/Output
: 🎜Content-Type: text/html; charset=utf-8
. You can achieve that either by settingdefault_charset
in php.ini (preferred), or manually usingheader()
.json_encode()
, addJSON_UNESCAPED_UNICODE
sebagai parameter kedua.Masuk :
mb_check_encoding()
melakukan helah, tetapi anda perlu menggunakannya secara religius. Tiada cara untuk mengatasinya, kerana pelanggan yang berniat jahat boleh menyerahkan data dalam pengekodan apa sahaja yang mereka mahu, dan saya tidak menemui helah untuk membuat PHP melakukan ini untuk anda dengan pasti.Nota kod lain:
Jelas sekali, semua fail yang anda akan berikan (PHP, HTML, JavaScript, dll.) hendaklah dikodkan menggunakan UTF-8 yang sah.
Anda perlu memastikan bahawa setiap kali anda memproses rentetan UTF-8, anda melakukannya dengan selamat, malangnya, ini adalah bahagian yang sukar anda mungkin ingin menggunakan sambungan
.mbstring
secara meluas.Untuk mengetahui perkara yang anda lakukan (baca: jangan kacau), anda benar-benar perlu memahami UTF-8 dan cara ia berfungsi pada tahap paling rendah yang mungkin. Semak mana-mana pautan di utf8.com untuk mendapatkan beberapa sumber hebat tentang semua yang anda perlu ketahui.
mbstring