Penyimpanan Data :
-
Tentukan
utf8mb4
set karakter pada semua tabel dan kolom teks di database Anda. Ini membuat MySQL secara fisik menyimpan dan mengambil nilai yang disandikan secara native di UTF-8. Perhatikan bahwa MySQL secara implisit akan menggunakanutf8mb4
penyandian jikautf8mb4_*
collation ditentukan (tanpa set karakter eksplisit). -
Di versi MySQL yang lebih lama (<5.5.3), sayangnya Anda akan terpaksa menggunakan hanya
utf8
, yang hanya mendukung sebagian dari karakter Unicode. Saya berharap saya bercanda.
Akses Data :
-
Dalam kode aplikasi Anda (mis. PHP), dalam metode akses DB apa pun yang Anda gunakan, Anda harus menyetel rangkaian karakter koneksi ke
utf8mb4
. Dengan cara ini, MySQL tidak melakukan konversi dari UTF-8 aslinya saat menyerahkan data ke aplikasi Anda dan sebaliknya. -
Beberapa driver menyediakan mekanismenya sendiri untuk mengonfigurasi kumpulan karakter koneksi, yang memperbarui status internalnya sendiri dan memberi tahu MySQL tentang pengkodean yang akan digunakan pada koneksiâini biasanya merupakan pendekatan yang lebih disukai. Dalam PHP:
-
Jika Anda menggunakan lapisan abstraksi PDO dengan PHP ⥠5.3.6, Anda dapat menentukan
charset
di DSN:$dbh = new PDO('mysql:charset=utf8mb4');
-
Jika Anda menggunakan mysqli, Anda dapat memanggil
set_charset()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Jika Anda terjebak dengan mysql biasa tetapi kebetulan menjalankan PHP ⥠5.2.3, Anda dapat memanggil
mysql_set_charset
.
-
-
Jika driver tidak menyediakan mekanismenya sendiri untuk menyetel kumpulan karakter koneksi, Anda mungkin harus mengeluarkan kueri untuk memberi tahu MySQL bagaimana aplikasi Anda mengharapkan data pada koneksi dikodekan:
SET NAMES 'utf8mb4'
. -
Pertimbangan yang sama mengenai
utf8mb4
/utf8
berlaku seperti di atas.
Keluaran :
- UTF-8 harus disetel di header HTTP, seperti
Content-Type: text/html; charset=utf-8
. Anda dapat mencapainya dengan menyeteldefault_charset
di php.ini (lebih disukai), atau secara manual menggunakanheader()
fungsi. - Jika aplikasi Anda mengirimkan teks ke sistem lain, mereka juga perlu diberi tahu tentang pengkodean karakter. Dengan aplikasi web, browser harus diberi tahu tentang pengkodean yang mengirimkan data (melalui header respons HTTP atau metadata HTML).
- Saat menyandikan keluaran menggunakan
json_encode()
, tambahkanJSON_UNESCAPED_UNICODE
sebagai parameter kedua.
Masukan :
- Browser akan mengirimkan data dalam kumpulan karakter yang ditentukan untuk dokumen, sehingga tidak ada hal khusus yang harus dilakukan pada masukan.
- Jika Anda ragu tentang penyandian permintaan (seandainya dapat diubah), Anda dapat memverifikasi setiap string yang diterima sebagai UTF-8 yang valid sebelum Anda mencoba menyimpannya atau menggunakannya di mana saja.
mb_check_encoding()
PHP melakukan trik, tetapi Anda harus menggunakannya secara religius. Benar-benar tidak ada jalan lain, karena klien jahat dapat mengirimkan data dalam penyandian apa pun yang mereka inginkan, dan saya belum menemukan trik agar PHP melakukan ini untuk Anda dengan andal.
Pertimbangan Kode Lainnya :
-
Cukup jelas, semua file yang akan Anda layani (PHP, HTML, JavaScript, dll.) harus dikodekan dalam UTF-8 yang valid.
-
Anda perlu memastikan bahwa setiap kali memproses string UTF-8, Anda melakukannya dengan aman. Sayangnya, ini adalah bagian yang sulit. Anda mungkin ingin menggunakan
mbstring
PHP secara ekstensif ekstensi. -
Operasi string bawaan PHP tidak secara default UTF-8 aman. Ada beberapa hal yang dapat Anda lakukan dengan aman dengan operasi string PHP normal (seperti penggabungan), tetapi untuk sebagian besar hal, Anda harus menggunakan
mbstring
yang setara fungsi. -
Untuk mengetahui apa yang Anda lakukan (baca:tidak mengacaukannya), Anda benar-benar perlu mengetahui UTF-8 dan cara kerjanya pada level serendah mungkin. Lihat salah satu tautan dari utf8.com untuk beberapa sumber daya yang bagus untuk mempelajari semua yang perlu Anda ketahui.
Selain pengaturan default_charset
di php.ini, Anda dapat mengirim rangkaian karakter yang benar menggunakan header()
dari dalam kode Anda, sebelum keluaran apa pun:
header('Content-Type: text/html; charset=utf-8');
Bekerja dengan Unicode di PHP itu mudah selama Anda menyadari bahwa sebagian besar fungsi string tidak bekerja dengan Unicode, dan beberapa mungkin merusak string sepenuhnya . PHP menganggap "karakter" panjangnya 1 byte. Terkadang tidak apa-apa (misalnya, explosion() hanya mencari urutan byte dan menggunakannya sebagai pemisah -- jadi tidak masalah karakter sebenarnya yang Anda cari). Namun di lain waktu, saat fungsi sebenarnya dirancang untuk bekerja pada karakter , PHP tidak tahu bahwa teks Anda memiliki karakter multi-byte yang ditemukan dengan Unicode.
Pustaka yang bagus untuk diperiksa adalah phputf8. Ini menulis ulang semua fungsi "buruk" sehingga Anda dapat mengerjakan string UTF8 dengan aman. Ada ekstensi seperti ekstensi mb_string yang juga mencoba melakukan ini untuk Anda, tetapi saya lebih suka menggunakan perpustakaan karena lebih portabel (tetapi saya menulis produk pasar massal, jadi itu penting bagi saya). Namun phputf8 dapat menggunakan mb_string di belakang layar, untuk meningkatkan kinerja.
Saya ingin menambahkan satu hal pada jawaban luar biasa chazomaticus:
Jangan lupa juga tag META (seperti ini, atau versi HTML4 atau XHTML-nya):
<meta charset="utf-8">
Kelihatannya sepele, tapi IE7 telah memberi saya masalah dengan itu sebelumnya.
Saya melakukan segalanya dengan benar; basis data, koneksi basis data, dan header HTTP Tipe-Konten semuanya disetel ke UTF-8, dan berfungsi dengan baik di semua browser lain, tetapi Internet Explorer tetap bersikeras menggunakan pengkodean "Eropa Barat".
Ternyata halaman tersebut tidak memiliki tag META. Menambahkan itu menyelesaikan masalah.
Edit:
W3C sebenarnya memiliki bagian yang agak besar yang didedikasikan untuk I18N. Mereka memiliki sejumlah artikel yang terkait dengan masalah ini – menjelaskan sisi HTTP, (X)HTML, dan CSS:
- FAQ:Mengubah pengodean halaman (X)HTML ke UTF-8
- Mendeklarasikan pengkodean karakter dalam HTML
- Tutorial:Kumpulan karakter &enkode dalam XHTML, HTML, dan CSS
- Menyetel parameter rangkaian karakter HTTP
Mereka merekomendasikan penggunaan header HTTP dan tag meta HTML (atau deklarasi XML jika XHTML disajikan sebagai XML).