我正在学习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。
由于将代码点编码为代理项对是从减去0x010000
开始的,因此这将导致负数。这个减法的要点是允许65536个代码点,而不是对遗漏的2048进行编码。如果整个代码空间在遥远的将来用完,这可能会被证明是有用的。
我没有官方消息来源来支持这一点,但我相信这是为了防止混淆,这样你就无法得到一个可以解释为有效UTF-16和有效UCS-2的代码序列。与增加1048576个新代码点相比,2048个代码点的损失不算什么。
代码点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,我还将
问题内容: 我在Python中有这样的字符串: 我该如何删除 从字符串的一部分? 问题答案: 您可以将其编码为并忽略错误: 输出:
我对C#UTF8编码感到困惑... 假设这些“事实”是正确的: Unicode是定义每个字符的“协议” 根据C#参考,每个字符的可接受范围为0x0000到0xFFFF。我不明白另一个字符是什么,它在0xFFFF之上,在Unicode协议中定义的? 与C#相比,当我使用Python编写UTF8文本时-它涵盖了所有预期范围(0x0000到0x10FFFF)。例如: 这对C不起作用。此外,当我将Pyth