Tajuk ditulis semula sebagai: "Menggunakan pengekodan UTF-8 sepanjang"
P粉321676640
P粉321676640 2023-08-21 21:12:13
0
2
454

Saya sedang menyediakan pelayan baharu dan mahukan sokongan penuh UTF-8 dalam aplikasi web saya. Saya telah mencuba ini pada pelayan sedia ada tetapi sentiasa perlu kembali ke ISO-8859-1.

Di manakah saya perlu menetapkan pengekodan/set aksara? Saya tahu saya perlu mengkonfigurasi Apache, MySQL dan PHP untuk mencapai ini - adakah terdapat beberapa senarai semak standard untuk diikuti, atau bolehkah ketidakpadanan diketepikan?

Ini ialah pelayan Linux baharu yang menjalankan MySQL 5, PHP 5 dan Apache 2.

P粉321676640
P粉321676640

membalas semua (2)
P粉790187507

Saya ingin menambah satu mata lagi pada jawapan cemerlangchazomaticus:

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 dan berfungsi dengan baik dalam semua penyemak imbas lain, tetapi Internet Explorer masih berkeras untuk menggunakan pengekodan "Eropah Barat".

Ternyata halaman tersebut tiada tag META. Selepas menambahnya, masalah itu telah diselesaikan.

Editor:

W3C sebenarnya mempunyaibahagianyang cukup besar khusus untuk pengantarabangsaan (I18N). Mereka mempunyai banyak 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 yang disediakan sebagai XML).

    P粉653045807

    Storan Data:

    • Nyatakanutf8mb4字符集。这样,MySQL会以UTF-8的原生编码方式物理存储和检索值。请注意,如果指定了utf8mb4_*排序规则(而没有明确指定字符集),MySQL将隐式使用utf8mb4pengekodan pada semua jadual dan lajur teks dalam pangkalan data.

    • Dalam versi MySQL yang lebih lama (utf8 yang hanya menyokong subset aksara Unicode. Saya harap saya bergurau.

    Akses data:

    • Dalam kod aplikasi (cth. PHP), tidak kira kaedah capaian pangkalan data yang anda gunakan, anda perlu menetapkan set aksara sambungan kepadautf8mb4. Dengan cara ini, MySQL tidak melakukan sebarang transformasi pada data apabila menghantarnya ke aplikasi 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 yang diutamakan. Dalam PHP:

      • Jika anda menggunakan lapisanPDOabstraksi untuk PHP ≥ 5.3.6, anda boleh nyatakandalamDSNcharset:

        $dbh = new PDO('mysql:charset=utf8mb4');
      • Jika anda menggunakanmysqli, anda boleh menghubungiset_charset():

        $mysqli->set_charset('utf8mb4'); // 面向对象风格 mysqli_set_charset($link, 'utf8mb4'); // 过程化风格
      • Jika anda terperangkap dalammysqltulen, tetapi kebetulan menjalankan PHP ≥ 5.2.3, anda boleh menghubungimysql_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 mengendalikan pengekodan data pada sambungan:SET NAMES 'utf8mb4'.

    • Kaveat yang sama tentangutf8mb4/utf8/

      seperti di atas terpakai di sini.

    Output

    :
    • UTF-8 hendaklah ditetapkan dalam pengepala HTTP, contohnya oleh fungsiContent-Type: text/html; charset=utf-8。你可以通过在php.ini中设置default_charset(首选)或手动使用header().
    • Jika aplikasi anda memindahkan teks ke sistem lain, mereka juga perlu mengetahui pengekodan aksara. Untuk aplikasi web, penyemak imbas mesti mengetahui pengekodan mana untuk menghantar data (sama ada melalui pengepala respons HTTP ataumetadata HTML).
    • Tambah menggunakanjson_encode()编码输出时,将JSON_UNESCAPED_UNICODEsebagai hujah kedua.

    Masuk:

    • Pelayar akan menyerahkan data dalam set aksara yang ditentukan oleh dokumen, jadi tiada pemprosesan khas diperlukan pada input.
    • Jika anda mempunyai keraguan tentang pengekodan permintaan (sekiranya ia mungkin telah diganggu), anda boleh mengesahkan bahawa setiap rentetan yang diterima adalah UTF-8 yang sah sebelum menyimpan atau menggunakan sebarang data. PHP'smb_check_encoding()boleh menyelesaikan masalah ini, tetapi anda perlu bertahan dengannya. Tidak ada jalan untuk mengatasi masalah ini, kerana pelanggan berniat jahat boleh menyerahkan data dalam mana-mana pengekodan yang mereka mahu, dan saya masih belum menemui helah untuk memastikan PHP melakukan ini untuk anda.

    Nota kod lain:

    • Jelas sekali, semua fail yang anda akan berikan (PHP, HTML, JavaScript, dll.) hendaklah dikodkan dalam UTF-8 yang sah.

    • Anda perlu memastikan bahawa setiap kali anda mengendalikan rentetan UTF-8 anda melakukannya dengan selamat. Malangnya, ini adalah bahagian yang sukar. Anda mungkin banyak menggunakan sambunganmbstringPHP.

    • Operasi rentetan terbina dalam PHP tidak selamat UTF-8 secara lalai.Anda boleh melakukan beberapa operasi dengan selamat menggunakan operasi rentetan PHP biasa seperti penggabungan, tetapi untuk kebanyakan kes anda harus menggunakan fungsimbstringyang setara.

    • Untuk mengetahui perkara yang anda lakukan (iaitu tidak kacau), anda benar-benar perlu memahami UTF-8 dan cara ia berfungsi pada tahap yang paling rendah. Terdapat beberapa sumber hebat diutf8.comuntuk mempelajari semua yang anda perlu ketahui.

      Muat turun terkini
      Lagi>
      kesan web
      Kod sumber laman web
      Bahan laman web
      Templat hujung hadapan
      Tentang kita Penafian Sitemap
      Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!