我要问一个很有争议的问题:“最流行的编码之一,UTF-16,应该被认为是有害的吗?”
我为什么要问这个问题?
有多少程序员知道UTF-16实际上是一种可变长度的编码?我的意思是,有一些代码点,表示为代理项对,接受多个元素。
我知道,很多应用程序、框架和API都使用UTF-16,例如Java的字符串、C‘S字符串、Win32 API、Qt库、ICU库等等。然而,在处理BMP字符(字符应该使用两个UTF-16元素进行编码)时,存在许多基本的错误。
例如,尝试编辑以下字符之一:
您可能会错过一些,这取决于您安装了哪些字体。这些字符都在BMP (基本的多语言平面)之外。如果看不到这些字符,也可以尝试在Unicode字符引用中查看它们。
例如,尝试在Windows中创建包含这些字符的文件名;尝试使用"backspace“删除这些字符,以查看它们在使用UTF-16的不同应用程序中的行为。我做了一些测试,结果很糟糕:
u'X'!=unicode('X','utf-16')时对这些字符进行了错误的编码,而X中的字符位于BMP之外。在许多使用UTF-16的应用程序中,这些bug似乎是非常容易找到的。
所以..。你认为UTF-16应该被认为是有害的吗?
发布于 2010-03-18 01:48:04
Unicode码点不是字符!有时它们甚至不是符号(视觉形式)。
下面是一些例子:
获得Unicode编辑权限的唯一方法是使用由专家编写的库,或者成为专家并自己编写库。如果你只是在计算编码点,你就生活在一个罪恶的状态中。
发布于 2009-07-24 08:21:31
关于Unicode转换形式(UTF)的使用有一个简单的经验规则:- utf-8用于存储和通信- utf-16用于数据处理-如果您使用的大多数平台API是utf-32 (在UNIX世界中很常见),那么可以使用utf-32。
当今大多数系统使用utf-16 (Windows、Mac、Java、.NET、ICU、Qt)。还请参阅本文档:http://unicode.org/notes/tn12/
回到"UTF-16有害“,我会说:绝对不会。
害怕代孕的人(认为他们把Unicode转换成可变长度的编码)不理解其他(更大的)复杂性,这使得字符和Unicode代码点之间的映射变得非常复杂:组合字符、连接线、变体选择器、控制字符等等。
只需阅读本系列http://www.siao2.com/2009/06/29/9800913.aspx,看看UTF-16如何成为一个简单的问题。
发布于 2011-08-01 17:30:55
是的,完全正确。
为什么?这与执行代码有关。
如果你看一下汤姆·克里斯汀森的这些大型语料库上的码点使用统计,你会发现反-8位BMP码点被使用了几个数量级,如果比非BMP码点多几个数量级:
2663710 U+002013 ‹–› GC=Pd EN DASH
1065594 U+0000A0 ‹ › GC=Zs NO-BREAK SPACE
1009762 U+0000B1 ‹±› GC=Sm PLUS-MINUS SIGN
784139 U+002212 ‹−› GC=Sm MINUS SIGN
602377 U+002003 ‹ › GC=Zs EM SPACE
544 U+01D49E ‹› GC=Lu MATHEMATICAL SCRIPT CAPITAL C
450 U+01D4AF ‹› GC=Lu MATHEMATICAL SCRIPT CAPITAL T
385 U+01D4AE ‹› GC=Lu MATHEMATICAL SCRIPT CAPITAL S
292 U+01D49F ‹› GC=Lu MATHEMATICAL SCRIPT CAPITAL D
285 U+01D4B3 ‹› GC=Lu MATHEMATICAL SCRIPT CAPITAL X以TDD的格言为例:“未经测试的代码是被破坏的代码”,并将其重新定义为“未执行的代码是已损坏的代码”,并考虑程序员需要处理非BMP代码点的频率。
与未将UTF-16作为可变宽度编码处理有关的bug比UTF-8中的等效bug更容易被忽略。有些编程语言仍然不能保证给你UTF-16而不是UCS-2,还有一些所谓的高级编程语言提供对代码单元的访问,而不是代码点(即使C也应该允许您访问代码点,如果您使用wchar_t,不管某些平台可能做什么)。
https://softwareengineering.stackexchange.com/questions/102205
复制相似问题