Sentiasa gunakan UTF-8
P粉964682904
P粉964682904 2023-08-27 16:00:18
0
2
502

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.

P粉964682904
P粉964682904

membalas semua (2)
P粉854119263

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

    P粉763662390

    Storan Data:

    • Nyatakanutf8mb4character 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 useutf8mb4encoding if autf8mb4_*himpunan ditentukan (tanpa set aksara eksplisit).

    • Dalam versi lama MySQL (< 5.5.3), malangnya anda akan terpaksa menggunakanutf8, 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 kepadautf8mb4Dengan 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 tentukancharsetdalamDSN:

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

        $mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
      • Jika anda terjebak dengan plainmysqltetapi kebetulan menjalankan PHP ≥ 5.2.3, anda boleh menghubungimysql_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 berkenaanutf8mb4/utf8/

      terpakai seperti di atas.

    Output

    :
    • UTF-8 hendaklah ditetapkan dalam pengepala HTTP, seperti fungsiContent-Type: text/html; charset=utf-8. You can achieve that either by settingdefault_charsetin php.ini (preferred), or manually usingheader().
    • Jika aplikasi anda memindahkan teks ke sistem lain, mereka juga perlu mengetahui pengekodan aksara. Untuk aplikasi web, penyemak imbas mesti diberitahu pengekodan untuk menghantar data (melalui pengepala respons HTTP ataumetadata HTML).
    • Apabila mengekodkan output menggunakanjson_encode(), addJSON_UNESCAPED_UNICODEsebagai parameter kedua.

    Masuk:

    • Pelayar akan menyerahkan data untuk set aksara yang ditentukan oleh dokumen, jadi tidak perlu melakukan sebarang operasi khas pada input.
    • Sekiranya anda mempunyai keraguan tentang pengekodan permintaan (sekiranya ia boleh diganggu), anda boleh mengesahkan setiap rentetan yang diterima sebagai UTF-8 yang sah sebelum anda cuba menyimpannya atau menggunakannya di mana-mana sahaja PHP'smb_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 sambunganmbstringsecara 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

      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!