Dan*_*eny 5 unicode utf-16 unicode-string
我正在阅读一些关于 Unicode 的问题,其中有一些我不完全理解的评论,例如:
Dean Harding:UTF-8是一种变长编码,处理起来比定长编码更复杂。另外,请参阅我对 Gumbo 答案的评论:基本上,所有编码(UTF-8、UTF-16 和 UTF-32)中都存在组合字符,并且它们需要特殊处理。您可以使用与组合字符相同的特殊处理来处理 UTF-16 中的代理项对,因此在大多数情况下您可以忽略代理项并将 UTF-16 视为固定编码。
我对最后一部分(“大部分”)有点困惑。如果UTF-16被视为固定的16位编码,这会导致什么问题?存在 BMP 之外的字符的可能性有多大?如果存在,如果您假设为两字节字符,这可能会导致什么问题?
我阅读了关于代孕者的维基百科信息,但它并没有真正让我更清楚事情!
编辑:我想我真正的意思是“为什么有人建议将 UTF-16 视为固定编码,而它看起来是假的?”
编辑2:
我在“ Is There Any Reasons to Preferred UTF-16 over UTF-8? ”中找到了另一条评论,我认为这更好地解释了这一点:
Andrew Russell:就性能而言:UTF-8 比 UTF-16 更难解码。在 UTF-16 中,字符要么是基本多语言平面字符(2 字节),要么是代理对(4 字节)。UTF-8 字符可以是 1 到 4 个字节之间的任意位置
这表明 UTF-16 不会有任何三字节字符,因此通过假设 16 位,您不会因减少一个字节而“完全搞砸”。但我仍然不相信这与假设 UTF-8 是单字节字符有什么不同!
UTF-16包括所有“基本平面”字符。BMP 涵盖了大多数当前的书写系统,并包括许多人们实际上可以遇到的较旧的字符。看看它们,然后决定你是否真的会遇到来自扩展位面的任何字符:楔形文字、炼金术符号等。很少有人会真正错过它们。
\n\n如果您仍然遇到需要扩展平面的字符,这些字符将由两个代码点(代理项)进行编码,并且您将看到两个空方块或问号,而不是这样的非字符。UTF 是自同步的,因此代理字符的一部分永远不会看起来像合法字符。即使存在代理项并且您不处理它们,这也允许字符串搜索之类的操作正常工作。
\n\n因此,除了不处理扩展字符这一事实之外,将 UTF-16 视为有效的 USC-2 所产生的问题很少。
\n\n编辑: Unicode 使用在前一个字符的空间处呈现的“组合标记”,如重音符号、波形符、音调符号等。有时,变音符号与字母的组合可以表示为不同的代码点,例如 \ xc3 \xa1可以表示为单个\\u00e1而不是普通的 \'a\' + 重音符号\\u0061\\u0301。但您仍然无法将z\xcc\x83等不常见的组合表示为一个代码点。这使得搜索和分割算法变得更加复杂。如果您以某种方式使字符串数据统一(例如,仅使用普通字母和组合标记),搜索和拆分将再次变得简单,但无论如何您都会失去“一个位置就是一个字符”属性。如果您认真进行排版并希望显式存储\xef\xac\x81或\xef\xac\x84等连字(其中一个代码点对应 2 或 3 个字符),就会出现对称问题。这不是 UTF 问题,而是一般的 Unicode 问题,AFAICT。
| 归档时间: |
|
| 查看次数: |
1102 次 |
| 最近记录: |