Sentiasa gunakan pengekodan UTF-8
P粉548512637
P粉548512637 2023-07-24 19:47:11
0
2
477
<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>
P粉548512637
P粉548512637

membalas semua(2)
P粉138871485

Saya ingin menambah jawapan terbaik chazomaticus:

Juga jangan lupa tag META (seperti ini, atau versi HTML4 atau XHTML):

<meta charset="utf-8">

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).

P粉381463780

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:

      $dbh = new PDO('mysql:charset=utf8mb4');
    • Jika anda menggunakan mysqli, anda boleh memanggil set_charset():

      $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
    • 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:

  • UTF-8 hendaklah ditetapkan dalam pengepala HTTP, contohnya Content-Type: text/html charset=utf-8; Anda boleh melakukan ini dengan menetapkan default_charset dalam php.ini (pilihan) atau secara manual menggunakan fungsi header().
  • Jika aplikasi anda memindahkan teks ke sistem lain, mereka perlu diberitahu pengekodan aksara juga. Untuk aplikasi web, penyemak imbas mesti diberitahu pengekodan di mana data dihantar (melalui pengepala respons HTTP atau metadata HTML).
  • Tambah JSON_UNESCAPED_UNICODE sebagai parameter kedua apabila menggunakan json_encode() untuk pengekodan output.

Input:

  • Pelayar akan menyerahkan data dalam set aksara yang ditentukan oleh dokumen, jadi tiada pemprosesan khas diperlukan pada bahagian input.
  • Jika anda mempunyai keraguan tentang pengekodan permintaan (mungkin diganggu), anda boleh mengesahkan bahawa setiap rentetan yang diterima adalah UTF-8 yang sah sebelum cuba menyimpan atau menggunakannya di mana-mana sahaja. mb_check_encoding() PHP boleh melakukan ini, tetapi anda mesti sentiasa menggunakannya. Tidak ada cara untuk mengatasinya, kerana pelanggan yang berniat jahat boleh menyerahkan data dalam mana-mana pengekodan yang mereka mahu, dan saya tidak menemui helah untuk memastikan PHP melakukan ini untuk anda.

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.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan