Saya akan bertanya apa yang mungkin merupakan pertanyaan yang cukup kontroversial: "Haruskah salah satu pengkodean paling populer, UTF-16, dianggap berbahaya?"
Mengapa saya menanyakan pertanyaan ini?
Berapa banyak programmer yang menyadari fakta bahwa UTF-16 sebenarnya adalah penyandian panjang variabel? Maksud saya, ada poin kode yang, diwakili sebagai pasangan pengganti, mengambil lebih dari satu elemen.
Aku tahu; banyak aplikasi, kerangka kerja dan API menggunakan UTF-16, seperti Java's String, C #'s String, Win32 APIs, pustaka Qt GUI, pustaka ICU Unicode, dll. Namun, dengan semua itu, ada banyak bug dasar dalam pemrosesan karakter keluar dari BMP (karakter yang harus dikodekan menggunakan dua elemen UTF-16).
Misalnya, coba edit salah satu karakter ini:
- 𝄞 ( U + 1D11E ) SIMBOL MUSIK G CLEF
- 𝕥 ( U + 1D565 ) MATEMATIK GANDA-STRUCK KECIL T
- 𝟶 ( U + 1D7F6 ) NOL DIGITAL MATEMATIKA NOL
- 𠂊 ( U + 2008A ) Karakter Han
Anda mungkin kehilangan beberapa, tergantung pada font apa yang telah Anda instal. Semua karakter ini berada di luar BMP (Basic Multilingual Plane). Jika Anda tidak dapat melihat karakter ini, Anda juga dapat mencoba melihatnya di referensi Karakter Unicode .
Misalnya, coba buat nama file di Windows yang menyertakan karakter ini; coba hapus karakter-karakter ini dengan "backspace" untuk melihat bagaimana mereka berperilaku dalam aplikasi yang berbeda yang menggunakan UTF-16. Saya melakukan beberapa tes dan hasilnya sangat buruk:
- Opera bermasalah dengan pengeditannya (perlu hapus 2 penekanan pada backspace)
- Notepad tidak dapat mengatasinya dengan benar (perlu hapus 2 penekanan pada backspace)
- Pengeditan nama file dalam dialog Window in broken (perlu hapus 2 penekanan pada backspace)
- Semua aplikasi QT3 tidak dapat mengatasinya - tampilkan dua kotak kosong bukan satu simbol.
- Python menyandikan karakter seperti itu secara salah ketika digunakan secara langsung
u'X'!=unicode('X','utf-16')
pada beberapa platform ketika X dalam karakter di luar BMP. - Python 2.5 unicodedata gagal mendapatkan properti pada karakter seperti itu ketika python dikompilasi dengan string Unicode UTF-16.
- StackOverflow tampaknya menghapus karakter ini dari teks jika diedit langsung sebagai karakter Unicode (karakter ini ditampilkan menggunakan HTML Unicode escapes).
- WinForms TextBox dapat menghasilkan string yang tidak valid ketika dibatasi dengan MaxLength.
Tampaknya bug seperti itu sangat mudah ditemukan di banyak aplikasi yang menggunakan UTF-16.
Jadi ... Apakah Anda berpikir bahwa UTF-16 harus dianggap berbahaya?