Vì vậy, nhiều thứ có thể xảy ra sai ở đây, bởi vì cơ sở dữ liệu, gửi biểu mẫu và các ký tự chuỗi mã nguồn đều có liên quan. Tôi giả sử bạn muốn sử dụng UTF-8, bởi vì với bất kỳ mã hóa điển hình nào khác (CP1252, Latin1), bạn sẽ gặp khó khăn khi muốn sử dụng json_
hoặc chấp nhận hơn ~ 200 ký tự khác nhau.
Điều đầu tiên cần làm là xóa bất kỳ loại mã chuyển đổi nào, v.v. được viết với mục đích cố gắng khắc phục sự cố mã hóa. Chẳng hạn như utf8_encode
, htmlentitites
, *_replace
.. sao cũng được.
Mã hóa nguồn.
$str = "· Close up the server";
Khi viết phần trên, tệp nguồn PHP cần được mã hóa vật lý bằng UTF-8. Nếu bạn đang sử dụng Windows, bạn phải thực hiện hoặc cấu hình điều này một cách rõ ràng. UTF-8 không xảy ra một cách kỳ diệu trên Windows.
Gửi biểu mẫu
Khi người dùng gửi biểu mẫu, trọng tải sẽ ở bất kỳ kiểu mã hóa nào mà bạn đã khai báo trang. Bạn có thể khai báo nó như vậy:
header("Content-Type: text/html; charset=utf-8");
Nhưng bất kỳ ai cũng có thể thực sự gửi các byte tùy ý đến máy chủ của bạn, vì vậy bạn nên xác thực dữ liệu đầu vào là UTF-8 trước khi tiếp tục. mb_check_encoding
tốt.
Cơ sở dữ liệu
Vì tại thời điểm này, dữ liệu của bạn đang ở dạng UTF-8, các chuỗi đầu vào của bạn ở dạng UTF-8. Bạn phải chỉ định điều này sau khi kết nối với cơ sở dữ liệu, bằng cách chỉ định mã hóa kết nối.
mysql_set_charset("utf8"); //After making the connection, and before any queries
//or $mysqli->set_charset( "utf8");
Điều này làm cho cơ sở dữ liệu đọc đầu vào của bạn trong UTF-8 và mã hóa đầu ra của nó trong UTF-8. Bạn cũng muốn đặt các cột / bảng / cơ sở dữ liệu của mình thành UTF-8.
Chuỗi thoát Unicode \uxxxx
hoặc \uhhhh\ullll
hoặc \Uxxxxxxxx
không được hỗ trợ trong PHP.