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。
代码点 U+D800 - U+DFFF 仅保留1以用于 UTF-16。由于它们不在 U+10000 - U+10FFFF 的范围内,UTF-16 不会使用代理对单独对它们进行编码,因此这些单独的代码点在 UTF 中显示为未编码是不明确的(并且是非法的2) -16 序列。
1 :问:什么是代理?
答:代理是来自两个特殊 Unicode 值范围的代码点,保留用作 UTF-16 中成对代码单元的前导和尾随值。前导(也称为高)代理是从 D800 16到 DBFF 16,尾随或低代理是从 DC00 16到 DFFF 16。它们被称为代理,因为它们不直接表示字符,而仅作为一对表示。
答:未配对的代理在 UTF 中无效。这些包括 D800 16到 DBFF 16范围内的任何值,后面没有 DC00 16到 DFFF 16范围内的值,或 DC00 16到 DFFF 16范围内的任何值前没有 D800 16到 DBFF 16范围内的值.
我没有官方消息来源来支持这一点,但我相信这是为了防止混淆,这样您就无法获得可以解释为有效 UTF-16 和有效 UCS-2 的代码序列。与新增的 1048576 个代码点相比,丢失 2048 个代码点根本算不了什么。
| 归档时间: |
|
| 查看次数: |
2376 次 |
| 最近记录: |