20
是否应将UTF-16视为有害的?
我要问的是一个有争议的问题:“是否应该将最流行的编码之一UTF-16视为有害?” 我为什么要问这个问题? 有多少程序员知道UTF-16实际上是可变长度编码的事实?我的意思是,有些代码点以代理对的形式表示,并包含多个元素。 我知道; 许多应用程序,框架和API使用UTF-16,例如Java的String,C#的String,Win32 API,Qt GUI库,ICU Unicode库等。但是,所有这些都在处理中存在许多基本的错误。 BMP中的字符数(应使用两个UTF-16元素编码的字符)。 例如,尝试编辑以下字符之一: 𝄞(U + 1D11E)音乐符号G CLEF 𝕥(U + 1D565)数学双打击小T 𝟶(U + 1D7F6)数学单点数字零 U(U + 2008A)汉字 您可能会错过一些字体,具体取决于您安装的字体。这些字符都在BMP(基本多语言平面)之外。如果看不到这些字符,也可以尝试在Unicode字符参考中查看它们。 例如,尝试在Windows中创建包含这些字符的文件名。尝试使用“退格键”删除这些字符,以查看它们在使用UTF-16的不同应用程序中的行为。我做了一些测试,结果很糟糕: Opera在编辑它们时遇到问题(在退格键上需要按2下删除) 记事本无法正确处理它们(删除需要按两次退格键) 在“窗口”对话框中编辑的文件名已损坏(需要删除,请按两次退格键) 所有QT3应用程序都不能处理它们-显示两个空的正方形而不是一个符号。 u'X'!=unicode('X','utf-16')当X在BMP之外的字符直接在某些平台上使用时,Python会错误地编码此类字符。 当Python用UTF-16 Unicode字符串编译时,Python 2.5 unicodedata无法获得此类字符的属性。 如果直接将它们作为Unicode字符进行编辑,则StackOverflow似乎从文本中删除了这些字符(这些字符使用HTML Unicode转义符显示)。 当受MaxLength限制时,WinForms TextBox可能会生成无效的字符串。 在使用UTF-16的许多应用程序中,此类错误似乎非常容易找到。 那么...您认为UTF-16应该被认为有害吗?
432
unicode