当前位置: 首页 > 知识库问答 >
问题:

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

夏朝
2023-03-14

我正在学习UTF-16编码,并且我已经读到,如果要表示U 10000到U 10FFFF范围内的码位,那么您必须使用代理项对,这些代理对在U D800到U DFFF的范围内。

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

首先,我布局这个位序列:

110110xxxxxxxxxx 110111xxxxxxxxxx

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

11011000010000001101110100100011(D840 DD23十六进制)

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

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

1101100000110110 1101110000010010(D836 DC12 十六进制)

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

共有3个答案

张成济
2023-03-14

由于将代码点编码为代理项对是从减去0x010000开始的,因此这将导致负数。这个减法的要点是允许65536个代码点,而不是对遗漏的2048进行编码。如果整个代码空间在遥远的将来用完,这可能会被证明是有用的。

劳昊明
2023-03-14

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

曾瀚昂
2023-03-14

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

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

1:问:什么是代理人?

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

< sup>2:问:有没有无效的16位值?

答:未配对的代理在UTF中无效。这些包括D80016到DBFF16范围内的任何值,后跟DC0016到DFFF16范围内的任何值,或DC0016到DFFF16范围内的任何值,前跟D80016到DBFF16范围内的任何值。

 类似资料:
  • 问题内容: 我有一个程序可以从Twitter流API实时解析推文。在存储它们之前,我将它们编码为utf8。某些字符最终以?,??或???出现在字符串中 而不是它们各自的unicode代码,并且会引起问题。经过进一步调查,我发现有问题的字符来自“表情符号”块 U + 1F600-U + 1F64F和“其他符号和象形文字”块 U + 1F300-U + 1F5FF。我尝试删除,但未成功,因为匹配器最终

  • 标准中提到了许多与字符集相关的概念:基本源字符集、基本执行字符集、基本执行范围字符集、执行字符集和执行范围字符集: 基本源字符集:91个图形字符,加上空格字符、HT、VT、FF、LF(仅借用ASCII中的名称缩写) 对于基本源字符集、基本执行字符集和基本执行范围字符集,我没有太多问题。 至于执行字符集,标准说它是由实现定义的,并且是特定于语言环境的,因此,我试图通过观察字符串文字初始化字符数组的字

  • 问题内容: 在下面查看我的代码。我有一个包含Unicode字符代码的JSON字符串。我将其转换为Java对象,然后将其转换回JSON字符串。但是,您可以看到输入和输出JSON字符串不匹配。是否可以使用Gson将我的对象转换为原始JSON字符串?我想和一样。 问题答案: 不幸的是,Gson似乎不支持它。所有JSON输入/输出分别集中在Gson(从2.8.0开始)和。可以使用其私有方法读取Unicod

  • 问题内容: 我正在寻找一种算法,该算法可以在带有变音符号的字符(tilde,circumflex,caret,umlaut,caron)与其“简单”字符之间进行映射。 例如: 等等。 我想用Java做到这一点,尽管我怀疑它应该是Unicode-y,并且应该可以轻松地以任何语言进行操作。 目的:允许轻松搜索带有变音标记的单词。例如,如果我有一个网球运动员数据库,并且输入了Björn_Borg,我还将

  • 我对C#UTF8编码感到困惑... 假设这些“事实”是正确的: Unicode是定义每个字符的“协议” 根据C#参考,每个字符的可接受范围为0x0000到0xFFFF。我不明白另一个字符是什么,它在0xFFFF之上,在Unicode协议中定义的? 与C#相比,当我使用Python编写UTF8文本时-它涵盖了所有预期范围(0x0000到0x10FFFF)。例如: 这对C不起作用。此外,当我将Pyth

  • 问题内容: 我在Python中有这样的字符串: 我该如何删除 从字符串的一部分? 问题答案: 您可以将其编码为并忽略错误: 输出: