Tôi sẽ hỏi điều gì có lẽ là một câu hỏi gây tranh cãi: "Liệu một trong những mã hóa phổ biến nhất, UTF-16, có được coi là có hại không?"
Tại sao tôi hỏi câu hỏi này?
Có bao nhiêu lập trình viên nhận thức được thực tế rằng UTF-16 thực sự là một mã hóa có độ dài thay đổi? Điều này có nghĩa là có những điểm mã, được biểu diễn dưới dạng cặp thay thế, lấy nhiều hơn một phần tử.
Tôi biết; Rất nhiều ứng dụng, khung và API sử dụng UTF-16, chẳng hạn như Chuỗi của Java, Chuỗi của C #, API Win32, thư viện GUI Qt, thư viện Unicode của ICU, v.v. trong số các ký tự ngoài BMP (các ký tự nên được mã hóa bằng hai phần tử UTF-16).
Ví dụ: cố gắng chỉnh sửa một trong các ký tự sau:
- ( U + 1D11E ) BIỂU TƯỢNG ÂM NHẠC
- ( U + 1D565 ) NHÂN ĐÔI TOÀN CẦU-MẠNH M SM NHỎ
- ( U + 1D7F6 ) TIẾNG VIỆT
- Nhân vật Han U ( U + 2008A )
Bạn có thể bỏ lỡ một số, tùy thuộc vào phông chữ bạn đã cài đặt. Các ký tự này đều nằm ngoài BMP (Mặt phẳng đa ngôn ngữ cơ bản). Nếu bạn không thể nhìn thấy các ký tự này, bạn cũng có thể thử xem chúng trong tham chiếu Ký tự Unicode .
Ví dụ: cố gắng tạo tên tệp trong Windows bao gồm các ký tự này; hãy thử xóa các ký tự này bằng "backspace" để xem cách chúng hoạt động trong các ứng dụng khác nhau sử dụng UTF-16. Tôi đã làm một số xét nghiệm và kết quả khá tệ:
- Opera có vấn đề với việc chỉnh sửa chúng (xóa 2 lần nhấn trên backspace)
- Notepad không thể xử lý chúng một cách chính xác (xóa 2 lần nhấn trên backspace)
- Chỉnh sửa tên tệp trong hộp thoại Window bị hỏng (xóa 2 lần nhấn trên backspace)
- Tất cả các ứng dụng QT3 không thể xử lý chúng - hiển thị hai ô vuông trống thay vì một biểu tượng.
- Python mã hóa các ký tự như vậy không chính xác khi được sử dụng trực tiếp
u'X'!=unicode('X','utf-16')
trên một số nền tảng khi X trong ký tự bên ngoài BMP. - Python 2.5 unicodingata không nhận được các thuộc tính trên các ký tự như vậy khi python được biên dịch bằng chuỗi Unicode UTF-16.
- StackOverflow dường như loại bỏ các ký tự này khỏi văn bản nếu được chỉnh sửa trực tiếp dưới dạng các ký tự Unicode (các ký tự này được hiển thị bằng cách sử dụng mã HTML Unicode).
- WinForms TextBox có thể tạo chuỗi không hợp lệ khi bị giới hạn với MaxLạng.
Có vẻ như các lỗi như vậy cực kỳ dễ tìm thấy trong nhiều ứng dụng sử dụng UTF-16.
Vậy ... Bạn có nghĩ rằng UTF-16 nên được coi là có hại không?