【发布时间】:2017-03-04 06:01:46
【问题描述】:
我正在学习 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+10123 变为
D840 DD23而不是D800 DD23? -
@Roland Illig 很奇怪,当我手动编码时我得到
D840 DD23,但是当我使用这个在线工具对其进行编码时:r12a.github.io/apps/conversion,我得到D800 DD23。难道我的手动编码方式不对? -
我们称之为保留而不是删除。有助于错误检测,您可以知道谁做错了,并在正确的位置提交错误报告。其他示例是 U+FFFE(向后匹配 BOM)和 U+FFFF(作为 C 文件结尾太容易出错)。
-
@Roland Illig 你是对的,
D800 DD23是正确答案,我做错的是我忘记从代码点中减去0x10000(这应该是我做的第一步)。
标签: unicode encoding character-encoding utf-16