Begitu banyak hal yang bisa salah di sini, karena basis data, pengiriman formulir, dan literal string kode sumber semuanya terlibat. Saya akan menganggap Anda ingin menggunakan UTF-8, karena dengan pengkodean tipikal lainnya (CP1252, Latin1) Anda akan kacau ketika Anda ingin menggunakan json_
atau terima lebih dari ~200 karakter berbeda.
Hal pertama yang harus dilakukan adalah menghapus segala jenis kode konversi dll yang ditulis dengan tujuan mencoba memperbaiki masalah penyandian. Seperti utf8_encode
, htmlentitites
, *_replace
.. apa pun.
Pengkodean sumber.
$str = "· Close up the server";
Saat menulis di atas, file sumber PHP perlu dikodekan secara fisik dalam UTF-8. Jika Anda menggunakan Windows, Anda harus secara eksplisit melakukan atau mengonfigurasi ini. UTF-8 tidak terjadi secara ajaib di Windows.
Formulir dikirimkan
Saat pengguna mengirimkan formulir, muatannya akan dalam penyandian apa pun yang Anda nyatakan sebagai halaman. Anda dapat mendeklarasikannya seperti ini:
header("Content-Type: text/html; charset=utf-8");
Tetapi siapa pun sebenarnya dapat mengirimkan byte arbitrer ke server Anda, jadi Anda harus memvalidasi input dalam UTF-8 sebelum melanjutkan. mb_check_encoding
bagus.
Basis Data
Karena pada titik ini data Anda masuk sebagai UTF-8, string input Anda dalam UTF-8. Anda harus menentukan ini setelah menghubungkan ke database, dengan menentukan penyandian koneksi.
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset( "utf8");
Ini membuat database membaca input Anda dalam UTF-8, dan mengkodekan outputnya dalam UTF-8. Anda juga ingin menyetel kolom/tabel/database ke UTF-8.
Urutan escape unicode \uxxxx
atau \uhhhh\ullll
atau \Uxxxxxxxx
tidak didukung di PHP.