为什么从 Unicode 字符集中删除了 U+D800 到 U+DFFF 范围内的代码点?

pau*_*aul 9 unicode encoding utf-16 character-encoding

我正在学习 UTF-16 编码,我读过如果你想表示 U+10000 到 U+10FFFF 范围内的代码点,那么你必须使用 U+D800 范围内的代理对到 U+DFFF。

因此,假设我想对以下代码点进行编码:U+10123(二进制为 10000000100100011):

首先我布置这个位序列:

110110xxxxxxxxxx 110111xxxxxxxxxx

然后我用代码点的二进制格式用 x 填充位置:

1101100001000000 1101110100100011 (D840 DD23 十六进制)


我也读过 U+D800 到 U+DFFF 范围内的代码点已从 Unicode 字符集中删除,但我不明白为什么删除了这个范围!

我的意思是这个范围可以很容易地用 4 个字节编码,例如以下是 U+D812 代码点的 UTF-16 编码格式(二进制为 1101100000010010):

1101100000110110 1101110000010010(十六进制D836 DC12)

注意:我在示例中使用了 UTF-16 Big Endian。

Rem*_*eau 9

代码点 U+D800 - U+DFFF 仅保留1以用于 UTF-16。由于它们不在 U+10000 - U+10FFFF 的范围内,UTF-16 不会使用代理对单独对它们进行编码,因此这些单独的代码点在 UTF 中显示为未编码是不明确的(并且是非法的2) -16 序列。


根据Unicode.org UTF-16 常见问题解答

1 :问:什么是代理?

答:代理是来自两个特殊 Unicode 值范围的代码点,保留用作 UTF-16 中成对代码单元的前导和尾随值。前导(也称为高)代理是从 D800 16到 DBFF 16,尾随或低代理是从 DC00 16到 DFFF 16。它们被称为代理,因为它们不直接表示字符,而仅作为一对表示

2 : Q: 是否有任何无效的 16 位值?

答:未配对的代理在 UTF 中无效。这些包括 D800 16到 DBFF 16范围内的任何值,后面没有 DC00 16到 DFFF 16范围内的值,或 DC00 16到 DFFF 16范围内的任何值前没有 D800 16到 DBFF 16范围内的值.


Mar*_*som 3

我没有官方消息来源来支持这一点,但我相信这是为了防止混淆,这样您就无法获得可以解释为有效 UTF-16 和有效 UCS-2 的代码序列。与新增的 1048576 个代码点相比,丢失 2048 个代码点根本算不了什么。