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.
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?
Ini terpakai kepada pelayan Linux baharu yang menjalankan MySQL 5, PHP, 5 dan Apache 2.
Saya ingin menambah satu perkarakepada jawapan yang sangat baik 一个>chazomaticus:
Juga jangan lupa teg META (seperti ini, atauversi 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 mempunyaibahagianyang 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 abstraksiPDOdengan PHP ≥ 5.3.6, anda boleh tentukan
charset
dalamDSN:Jika anda menggunakanmysqli, anda boleh menghubungi
set_charset()
:Jika anda terjebak dengan plainmysqltetapi 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 diutf8.comuntuk mendapatkan beberapa sumber hebat tentang semua yang anda perlu ketahui.
mbstring