首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF-16是否应被视为有害?

UTF-16是否应被视为有害?
EN

Software Engineering用户
提问于 2009-06-26 16:04:18
回答 18查看 130.2K关注 0票数 432

我要问一个很有争议的问题:“最流行的编码之一,UTF-16,应该被认为是有害的吗?”

我为什么要问这个问题?

有多少程序员知道UTF-16实际上是一种可变长度的编码?我的意思是,有一些代码点,表示为代理项对,接受多个元素。

我知道,很多应用程序、框架和API都使用UTF-16,例如Java的字符串、C‘S字符串、Win32 API、Qt库、ICU库等等。然而,在处理BMP字符(字符应该使用两个UTF-16元素进行编码)时,存在许多基本的错误。

例如,尝试编辑以下字符之一:

  • U+1D11E(𝄞)音乐符号G
  • U+1D565(𝕥)数学双击小T
  • U+1D7F6(𝟶)数学单空间数字零点
  • U+2008A(𠂊)汉字

您可能会错过一些,这取决于您安装了哪些字体。这些字符都在BMP (基本的多语言平面)之外。如果看不到这些字符,也可以尝试在Unicode字符引用中查看它们。

例如,尝试在Windows中创建包含这些字符的文件名;尝试使用"backspace“删除这些字符,以查看它们在使用UTF-16的不同应用程序中的行为。我做了一些测试,结果很糟糕:

  • Opera在编辑它们时有问题(在backspace上删除所需的2次按压)
  • 记事本无法正确地处理它们(删除所需的2次背景色)
  • 断续窗口对话框中的文件名编辑(删除后置空间上需要的2次按压)
  • 所有的QT3应用程序都不能处理它们--显示两个空方块而不是一个符号。
  • Python在某些平台上直接使用u'X'!=unicode('X','utf-16')时对这些字符进行了错误的编码,而X中的字符位于BMP之外。
  • Python2.5独角形数据在用UTF-16 Unicode字符串编译Python时无法获得这些字符的属性。
  • 如果以Unicode字符的形式直接编辑这些字符,StackOverflow似乎会从文本中删除这些字符(这些字符使用HTML转义显示)。
  • WinForms文本框可能生成无效的字符串.当与MaxLength限制时。

在许多使用UTF-16的应用程序中,这些bug似乎是非常容易找到的。

所以..。你认为UTF-16应该被认为是有害的吗?

EN

回答 18

Software Engineering用户

发布于 2010-03-18 01:48:04

Unicode码点不是字符!有时它们甚至不是符号(视觉形式)。

下面是一些例子:

  • 像"ⅲ“这样的罗马数字代码点。(一个看上去像“iii”的字符。)
  • 重音字符,如"á",可以表示为单个组合字符"\u00e1“,也可以表示为一个字符并分隔为"\u0061\u0301”。
  • 像希腊文小写的西格玛这样的字符,它们对于单词位置的中间("σ")和结尾("ς")有不同的形式,但应该被认为是搜索的同义词。
  • Unicode任意连字符U+00AD,根据上下文的不同,它可能会或不被可视化显示,在语义搜索中会被忽略。

获得Unicode编辑权限的唯一方法是使用由专家编写的库,或者成为专家并自己编写库。如果你只是在计算编码点,你就生活在一个罪恶的状态中。

票数 156
EN

Software Engineering用户

发布于 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如何成为一个简单的问题。

票数 54
EN

Software Engineering用户

发布于 2011-08-01 17:30:55

是的,完全正确。

为什么?这与执行代码有关。

如果你看一下汤姆·克里斯汀森的这些大型语料库上的码点使用统计,你会发现反-8位BMP码点被使用了几个数量级,如果比非BMP码点多几个数量级:

代码语言:javascript
复制
 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,不管某些平台可能做什么)。

票数 43
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/102205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档