Lưu trữ dữ liệu :
-
Chỉ định
utf8mb4
bộ ký tự trên tất cả các bảng và cột văn bản trong cơ sở dữ liệu của bạn. Điều này làm cho MySQL lưu trữ vật lý và truy xuất các giá trị được mã hóa nguyên bản trong UTF-8. Lưu ý rằng MySQL sẽ ngầm sử dụngutf8mb4
mã hóa nếu mộtutf8mb4_ *
đối chiếu được chỉ định (không có bất kỳ bộ ký tự rõ ràng nào). -
Trong các phiên bản MySQL cũ hơn (<5.5.3), bạn sẽ không may bị buộc chỉ sử dụng
utf8
, chỉ hỗ trợ một tập hợp con các ký tự Unicode. Tôi ước tôi đang đùa.
Quyền truy cập dữ liệu :
-
Trong mã ứng dụng của bạn (ví dụ:PHP), trong bất kỳ phương thức truy cập DB nào bạn sử dụng, bạn sẽ cần đặt bộ ký tự kết nối thành
utf8mb4
. Bằng cách này, MySQL không chuyển đổi từ UTF-8 gốc của nó khi nó chuyển dữ liệu cho ứng dụng của bạn và ngược lại. -
Một số trình điều khiển cung cấp cơ chế riêng của họ để định cấu hình bộ ký tự kết nối, cả hai đều cập nhật trạng thái bên trong của chính nó và thông báo cho MySQL về mã hóa sẽ được sử dụng trên kết nối — đây thường là cách tiếp cận được ưu tiên. Trong PHP:
-
Nếu bạn đang sử dụng PDO lớp trừu tượng với PHP ≥ 5.3.6, bạn có thể chỉ định
bộ ký tự
trong DSN :$dbh = new PDO('mysql:charset=utf8mb4');
-
Nếu bạn đang sử dụng mysqli , bạn có thể gọi
set_charset ()
:$mysqli->set_charset('utf8mb4'); // object oriented style mysqli_set_charset($link, 'utf8mb4'); // procedural style
-
Nếu bạn gặp khó khăn với mysql đơn giản nhưng tình cờ đang chạy PHP ≥ 5.2.3, bạn có thể gọi
mysql_set_charset
.
-
-
Nếu trình điều khiển không cung cấp cơ chế riêng để đặt bộ ký tự kết nối, bạn có thể phải đưa ra truy vấn để cho MySQL biết ứng dụng của bạn mong muốn dữ liệu trên kết nối được mã hóa như thế nào:
ĐẶT TÊN 'utf8mb4'
. -
Sự cân nhắc tương tự đối với
utf8mb4
/utf8
áp dụng như trên.
Đầu ra :
-
Nếu ứng dụng của bạn truyền văn bản đến các hệ thống khác, chúng cũng sẽ cần được thông báo về mã hóa ký tự. Với các ứng dụng web, trình duyệt phải được thông báo về kiểu mã hóa mà dữ liệu được gửi (thông qua tiêu đề phản hồi HTTP hoặc siêu dữ liệu HTML ).
-
Trong PHP, bạn có thể sử dụng
default_charset
tùy chọn php.ini hoặc phát hànhContent-Type
theo cách thủ công Bản thân tiêu đề MIME, chỉ là công việc nhiều hơn nhưng có tác dụng tương tự. -
Khi mã hóa đầu ra bằng
json_encode ()
, thêmJSON_UNESCAPED_UNICODE
dưới dạng tham số thứ hai.
Đầu vào :
-
Thật không may, bạn nên xác minh mọi chuỗi nhận được là UTF-8 hợp lệ trước khi bạn cố gắng lưu trữ hoặc sử dụng nó ở bất kỳ đâu. PHP của
mb_check_encoding ()
là thủ thuật, nhưng bạn phải sử dụng nó một cách tôn giáo. Thực sự không có cách nào để giải quyết vấn đề này, vì các máy khách độc hại có thể gửi dữ liệu bằng bất kỳ kiểu mã hóa nào họ muốn và tôi chưa tìm ra mẹo nào để khiến PHP thực hiện việc này một cách đáng tin cậy. -
Từ việc tôi đọc thông số kỹ thuật HTML hiện tại của tôi , các dấu đầu dòng sau không cần thiết hoặc thậm chí còn hợp lệ đối với HTML hiện đại. Sự hiểu biết của tôi là các trình duyệt sẽ làm việc với và gửi dữ liệu trong bộ ký tự được chỉ định cho tài liệu. Tuy nhiên, nếu bạn đang nhắm mục tiêu các phiên bản HTML cũ hơn (XHTML, HTML4, v.v.), những điểm này có thể vẫn hữu ích:
- Chỉ dành cho HTML trước HTML5 :bạn muốn tất cả dữ liệu do trình duyệt gửi cho bạn ở dạng UTF-8. Thật không may, nếu bạn đi theo cách duy nhất để làm điều này một cách đáng tin cậy là thêm
bộ ký tự chấp nhận
thuộc tính cho tất cả - Chỉ dành cho HTML trước HTML5 :lưu ý rằng thông số kỹ thuật HTML của W3C nói rằng máy khách "nên" mặc định gửi biểu mẫu trở lại máy chủ trong bất kỳ bộ ký tự nào mà máy chủ phân phối, nhưng đây rõ ràng chỉ là một đề xuất, do đó cần phải rõ ràng trên mỗi
- Chỉ dành cho HTML trước HTML5 :bạn muốn tất cả dữ liệu do trình duyệt gửi cho bạn ở dạng UTF-8. Thật không may, nếu bạn đi theo cách duy nhất để làm điều này một cách đáng tin cậy là thêm
Cân nhắc mã khác :
-
Rõ ràng là đủ, tất cả các tệp bạn sẽ phân phát (PHP, HTML, JavaScript, v.v.) phải được mã hóa bằng UTF-8 hợp lệ.
-
Bạn cần đảm bảo rằng mỗi khi bạn xử lý chuỗi UTF-8, bạn làm như vậy một cách an toàn. Thật không may, đây là phần khó. Có thể bạn sẽ muốn sử dụng rộng rãi
mbstring
phần mở rộng. -
Các hoạt động chuỗi tích hợp của PHP không theo mặc định UTF-8 an toàn. Có một số điều bạn có thể làm một cách an toàn với các hoạt động chuỗi PHP bình thường (như nối), nhưng đối với hầu hết mọi thứ, bạn nên sử dụng
mbstring
tương đương chức năng. -
Để biết bạn đang làm gì (đọc:không làm rối nó lên), bạn thực sự cần biết UTF-8 và cách nó hoạt động ở mức thấp nhất có thể. Kiểm tra bất kỳ liên kết nào từ utf8.com để có một số tài nguyên tốt để tìm hiểu mọi thứ bạn cần biết.