utf8
của MySQL bộ ký tự không thực sự là UTF-8 , đó là một tập hợp con của UTF-8 chỉ hỗ trợ mặt phẳng cơ bản (các ký tự lên đến U + FFFF). Hầu hết các biểu tượng cảm xúc sử dụng điểm mã cao hơn U + FFFF. utf8mb4
của MySQL là UTF-8 thực tế có thể mã hóa tất cả các điểm mã đó. Bên ngoài MySQL không có cái gọi là "utf8mb4", chỉ có UTF-8. Vì vậy:
Một lần nữa, không có cái gọi là "utf8mb4". Yêu cầu HTTP POST hỗ trợ bất kỳ byte thô nào, nếu khách hàng của bạn gửi dữ liệu được mã hóa UTF-8 thì bạn vẫn ổn.
Có.
Chúa ơi, sử dụng UTF-8 thô (utf8mb4
) cho tất cả những gì là thánh.
Vâng, có vấn đề của bạn; truyền dữ liệu của bạn thông qua utf8
của MySQL bộ ký tự sẽ loại bỏ bất kỳ ký tự nào trên U + FFFF. Sử dụng utf8mb4
thông qua MySQL.
Bạn sẽ phải xác định chính xác điều đó có nghĩa là gì. Các hàm JSON của PHP sẽ có thể xử lý tốt mọi điểm mã Unicode, miễn là nó hợp lệ UTF-8:
echo json_encode('😀');
"\ud83d\ude00"
echo json_decode('"\ud83d\ude00"');
😀