【发布时间】:2016-02-12 01:25:37
【问题描述】:
我 seen 认为 >2 字节的 unicode 代码点(如 U+10000)可以写成一对,如 \uD800\uDC00。它们似乎以轻咬 d 开头,但我注意到的仅此而已。
这个分裂动作叫什么?它是如何工作的?
【问题讨论】:
-
UTF 定义了代码点如何编码为代码单元,其大小可以是 7 位、8 位、16 位或 32 位,具体取决于 UTF。 UTF-8 使用 1、2、3 或 4 个 8 位代码单元对代码点进行编码,具体取决于代码点的值。 UTF-16 使用 1 个或 2 个 16 位代码单元对代码点进行编码,其中 2 个代码单元一起作用称为代理对。每个 UTF 都定义了自己的算法,用于将代码点转换为代码单元序列,反之亦然。阅读 UTF 规范。
-
简而言之,对于 UTF-16,如果代码点 > 0xFFFF,则从中减去 0x010000,剩下 20 位。它们被分成两半,其中高 10 位添加到 0xD800,低 10 位添加到 0xDC00。从而创建一个代理对。
-
Unicode 最初是 16 位标准,一直到第 3 版。当决定需要更多位时,预留了一组代码点来编码更高的代码点,以便围绕16 位版本在没有重大改造的情况下仍然可以“工作”。将代码点编码为代理对和 UTF-16 将代码点直接编码为 UTF-16。注意 UTF-8 用于支持编码为代理对的补充代码点,总共 6 个字节。这不再受支持。见 CESU-8,unicode.org/reports/tr26
-
@ShannonSeverance:您所指的“16 位版本”被称为 UCS-2,而不是 UTF-16。 UTF-16 向后兼容 UCS-2,但为编码不适合 UCS-2 的代码点添加了代理对。
-
@Clearquestionwithexamples:代理对是两个 16 位代码单元一起工作。您在问题中显示的这对使用转义序列来表示各个代码单元的数值。
标签: unicode