Sự lựa chọn không nằm giữa ASCII và UTF-8. ASCII là mã hóa 7 bit và UTF-8 thay thế nó - bất kỳ văn bản ASCII hợp lệ nào cũng là UTF-8 hợp lệ. Các vấn đề phát sinh khi bạn sử dụng các ký tự không phải ASCII; đối với những điều này, bạn phải chọn giữa UTF-8, UTF-16, UTF-32 và các bảng mã 8 bit khác nhau (ISO-xxxx, v.v.).
Giải pháp tốt nhất là gắn bó với bộ ký tự ASCII nghiêm ngặt, nghĩa là, không sử dụng bất kỳ ký tự không phải ASCII nào trong mã của bạn. Hầu hết các ngôn ngữ lập trình cung cấp các cách để thể hiện các ký tự không phải ASCII bằng các ký tự ASCII, ví dụ: "\u1234"
để chỉ ra điểm mã Unicode ở 1234. Đặc biệt, tránh sử dụng các ký tự không phải ASCII cho mã định danh. Ngay cả khi chúng hoạt động chính xác, những người sử dụng bố cục bàn phím khác sẽ chửi bạn vì đã khiến họ gõ những ký tự này.
Nếu bạn không thể tránh các ký tự không phải ASCII, UTF-8 là lựa chọn tốt nhất của bạn. Không giống như UTF-16 và UTF-32, nó là siêu ký tự của ASCII, có nghĩa là bất kỳ ai mở nó với mã hóa sai đều nhận được ít nhất là đúng; và không giống như các bản mã 8 bit, nó có thể mã hóa về mọi ký tự mà bạn cần, rõ ràng và nó có sẵn trên mọi hệ thống, bất kể ngôn ngữ.
Và sau đó bạn có mã hóa mà mã của bạn xử lý; điều này không phải giống như mã hóa tệp nguồn của bạn. Ví dụ, tôi có thể dễ dàng viết PHP bằng UTF-8, nhưng đặt mã hóa đa bào bên trong của nó thành Latin, 1; bởi vì trình phân tích cú pháp PHP hoàn toàn không liên quan đến mã hóa, mà chỉ đọc các chuỗi byte, nên các chuỗi ký tự UTF-8 của tôi sẽ bị hiểu sai thành tiếng Latin-1. Nếu tôi xuất các chuỗi này trên thiết bị đầu cuối UTF-8, bạn sẽ không thấy bất kỳ sự khác biệt nào, nhưng độ dài chuỗi và các hoạt động đa nhân khác (ví dụ substr
) sẽ tạo ra kết quả sai.
Nguyên tắc nhỏ của tôi là sử dụng UTF-8 cho mọi thứ; chỉ khi bạn hoàn toàn phải xử lý các mã hóa khác, hãy chuyển đổi sang UTF-8 càng sớm càng tốt và từ UTF-8 càng muộn càng tốt.