Tôi đang làm việc cho các khách hàng quốc tế có tất cả các bảng chữ cái rất khác nhau và vì vậy tôi đang cố gắng có được một tổng quan về quy trình làm việc hoàn chỉnh giữa PHP và MySQL để đảm bảo mã hóa ký tự được chèn chính xác. Tôi đã đọc một loạt các hướng dẫn về điều này nhưng vẫn còn có câu hỏi (có nhiều điều để tìm hiểu) và nghĩ rằng tôi có thể chỉ cần đặt tất cả lại với nhau ở đây và yêu cầu.Quy trình làm việc UTF8 PHP, MySQL tóm tắt
PHP
header('Content-Type:text/html; charset=UTF-8');
mb_internal_encoding('UTF-8');
HTML
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<form accept-charset="UTF-8"> .. </form>
(mặc dù sau này là không bắt buộc và là một đề xuất nhưng tôi tin tưởng Tôi thà đề nghị như không làm gì cả)
MySQL
CREATE database_name DEFAULT CHARACTER SET utf8;
hoặc ALTER database_name DEFAULT CHARACTER SET utf8;
và/hoặc sử dụng utf8_general_ci
làm collation kết nối MySQL.
(nó là important to note đây rằng điều này sẽ làm tăng kích thước cơ sở dữ liệu nếu nó sử dụng varchar)
kết nối
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER_SET utf8");
doanh nghiệp Logic
phát hiện nếu không UTF8 với mb_detect_encoding()
và chuyển đổi với ivon()
.
xác nhận chuỗi quá dài UTF8 và UTF16
$body=preg_replace('/[\x00-\x08\x10\x0B\x0C\x0E-\x19\x7F]|(?<=^|[\x00-\x7F])[\x80-\xBF]+|([\xC0\xC1]|[\xF0-\xFF])[\x80-\xBF]*|[\xC2-\xDF]((?![\x80-\xBF])|[\x80-\xBF]{2,})|[\xE0-\xEF](([\x80-\xBF](?![\x80-\xBF]))|(?![\x80-\xBF]{2})|[\x80-\xBF]{3,})/','�',$body);
$body=preg_replace('/\xE0[\x80-\x9F][\x80-\xBF]|\xED[\xA0-\xBF][\x80-\xBF]/S','?', $body);
Câu hỏi
là
mb_internal_encoding('UTF-8')
cần thiết trong PHP 5.3 và cao hơn và nếu như vậy không có nghĩa là tôi phải sử dụng tất cả các chức năng đa byte thay vì các chức năng chính của nó nhưmb_substr()
thay vìsubstr()
?vẫn cần kiểm tra các lỗi đầu vào không đúng định dạng và nếu có thì chức năng/lớp đáng tin cậy sẽ làm như thế nào? Tôi có thể không muốn loại bỏ dữ liệu xấu và không biết đủ về chuyển ngữ.
nó có thực sự là
utf8_general_ci
hoặc đúng hơn làutf8_bin
?có điều gì đó thiếu trong quy trình trên không?
nguồn:
http://coding.smashingmagazine.com/2012/06/06/all-about-unicode-utf8-character-sets/
http://webcollab.sourceforge.net/unicode.html
http://stackoverflow.com/a/3742879/1043231
http://www.adayinthelifeof.nl/2010/12/04/about-using-utf-8-fields-in-mysql/
http://akrabat.com/php/utf8-php-and-mysql/
ok, vậy câu hỏi là gì? –
xin lỗi tôi đã đấu tranh với việc đăng câu hỏi này vì có vẻ như lỗi stackoverflow một số url nguồn của tôi là mã và ném lỗi .... hoạt động bây giờ ... – Dominik
mb_internal_encoding ('UTF-8') là cần thiết nếu kết quả mb_internal_encoding() không phải là UTF-8. –