UTF-8 (nói chung) là một mã hóa “an toàn” cho bất kỳ bộ ký tự nào trên thế giới. (Không phải lúc nào cũng hiệu quả nhất và có một số lập luận cho rằng Unicode đại diện cho các tập lệnh CJK với mô hình “han hợp nhất” của nó, nhưng vẫn tiếp tục…)
Tuy nhiên, có khả năng (các) chương trình giao diện của bạn không dịch sang / từ UTF-8 đúng cách. Ví dụ:ó => ó có vẻ như dữ liệu UTF-8 (trong đó một ký tự có thể được trải rộng trên một số byte khác nhau) đang được hiển thị cho bạn bằng cách sử dụng mã hóa Châu Âu một byte, như ISO-8859-15 hoặc MS- CP-1451 hoặc tương tự.
Bạn có lẽ là lưu trữ dữ liệu một cách chính xác, nhưng đang tải nó không chính xác. Nếu bạn chỉ sử dụng mysql
chương trình đầu cuối hoặc chương trình tương tự, hãy đảm bảo rằng thiết bị đầu cuối của bạn được đặt để sử dụng UTF-8 (trên hệ thống Unix / Linux, locale
có lẽ phải là thứ gì đó kết thúc bằng .utf8
, ví dụ. của tôi có LANG=en_US.utf8
)
Nếu bạn đang lấy dữ liệu bằng công cụ GUI hoặc công cụ tương tự, hãy kiểm tra bảng Cài đặt / Tùy chọn của nó để biết bộ ký tự.
Nếu bạn nhận được các ký tự được dịch sai trở lại trong một ứng dụng bạn đã viết, hãy xem các công cụ của ngôn ngữ của bạn để thiết lập ngôn ngữ. (Có lẽ, INSERT
quy trình làm đúng, nhưng SELECT
có sai quy trình không?)
Và, nếu điều này đang được gửi đến Web, hãy đảm bảo rằng các tệp (XML | HTML | XHTML) của bạn có charset=utf8
được khai báo ở (các) vị trí thích hợp, hoặc dịch ngược từ UTF-8 sang bộ ký tự trong tài liệu của bạn (nếu có thể) bằng cách sử dụng một cái gì đó như iconv
khi chèn văn bản từ cơ sở dữ liệu. (Tất nhiên, hầu hết các bộ ký tự không phải Unicode chỉ có thể đại diện cho một tập con của Unicode; ví dụ:bộ ISO-8859-15 thực hiện rất tốt việc bao gồm các ngôn ngữ châu Âu, nhưng không hỗ trợ hệ thống viết Cyrillic, Ả Rập hoặc CJK, vì vậy có thể không dịch được một ký tự.) Trong Perl, bạn có thể sử dụng đối số truyền để open
hoặc sử dụng binmode
để thiết lập lớp dịch tập hợp ký tự trong suốt trên luồng "xử lý tệp".