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

UTF-16编码如何使用代理码点?

逑衡
2023-03-14

根据统一码规范

D91 UTF-16 编码形式:在 U 0000..U D7FF 和 U E000 范围内分配每个 Unicode 标量值的 Unicode 编码形式。U FFFF 到与 Unicode 标量值具有相同数值的单个无符号 16 位代码单元,并将 U 10000..U 10FFFF 范围内的每个 Unicode 标量值分配给代理项对。

术语“标量值”是指 Unicode 码位,即必须通过不同的编码形式(UTF-16 等)编码成特定字节序列的抽象概念的范围。因此,似乎这个摘录要点是考虑到并非所有码位都可以容纳到一个UTF-16代码单元(两个字节)中,有些代码点应该被编码成一对代码单元 - 4个字节(它被称为“代理项对”)。

但是,术语“标量值”的定义如下:

D76 Unicode标量值:除高代理项和低代理项码位之外的任何Unicode码位。

等。。。Unicode 是否有代理代码点?当 UTF-16 可以使用 4 个字节来表示标量点时,它的原因是什么?任何人都可以解释一下基本原理以及UTF-16如何使用这个代码点吗?

共有2个答案

向泽语
2023-03-14

只是为了最终澄清。

  • UTF-16 使用 16 位(2 字节)代码单元。这意味着这种编码格式通常将代码点(=抽象的想法应该以某种方式在计算机内存中表示)编码为16位(因此解释器据称一次读取数据为两个字节)。
  • UTF-16做得最好非常简单:U 000E码位将编码为000E,U 000F编码为000F,依此类推。
  • 问题是16位只能提出不足以容纳所有Unicode码位的范围(0000..FFFF只允许65 536个可能的值)。我们可能会使用两个16位字(4字节)作为超出此范围的码位(实际上,我的误解是为什么UTF-16不这样做)。但是,这种方法会导致无法解码某些值。例如,如果我们将U 10000码位编码为0001 0000(十六进制表示法),解释器究竟应该如何解码这样的表示:作为两个子码位U 0001和U 0000或作为单个U 10000?
  • 统一码规范倾向于更好的方法。如果需要对范围 U 10000..U 10FFF(1 048 576 码位)进行编码,那么我们应该将 1 024 1 024 = 2 048 值与可以用 16 位编码的值区分开来(规范选择了 D800.) 。它的DFFF范围)。当一个穿插者打D800时。计算机内存中的DBFF(高代理区域)值,它知道它不是隐含的“完全成熟的”代码点(不是规范中的标量值),它应该读取另外16位才能从DC00中获取值。DFFF 范围(低代理项区域),并最终得出结论,U 10000..U 10FFF 代码点中的哪一个用这 4 个字节(使用此代理项对)进行编码。注意,这样的方案可以编码1 024 * 1 024 = 1
子车凯泽
2023-03-14

是的,Unicode 为代理代码点保留范围:

    < li >高替代区域U D800到U DBFF < li >低替代区域U DC00到U DFFF

Unicode保留这些范围,因为这些16位值在代理对中使用,并且不能为它们分配其他符号。代理对是两个16位值,它们对U FFFF上方的代码点进行编码,这些代码点不适合单个16位值。

 类似资料:
  • 问题内容: 现在考虑下面给出的代码: 当我尝试调试上面代码中的行时,调试器将我带到String类的方法中,然后将我带到StringCoding类的方法中。在调试过程中,encode方法的第一行()返回“ UTF-8”作为默认编码。我希望它是“ UTF-16”。 该程序的输出为: 最= 6700的Unicode值UTF-8字符=最| 默认值:字节数= 3 对应的UTF-16字符= UTF-16:字节

  • 世界中的字符有许许多多,有英文,中文,韩文等。我们强烈需要一个大大的映射表把世界上的字符映射成计算机可以阅读的二进制数字(字节)。 这样,每个字符都给予一个独一无二的编码,就不会出现写文字的人和阅读文字的人编码不同而出现无法读取的乱码现象了。 于是Unicode就出现了,它是一种所有符号的编码映射。最开始的时候,unicode认为使用两个字节,也就是16位就能包含所有的字符了。 但是非常可惜,两个

  • 问题内容: 该JSON RFC,第2.5节,说部分: 为了转义不在“基本多语言平面”中的扩展字符,该字符表示为十二个字符的序列,对UTF-16代理对进行编码。因此,例如,仅包含G谱号字符(U + 1D11E)的字符串可以表示为“ \ uD834 \ uDD1E”。 假设我有合理的理由将JSON编码为UTF-16BE(允许)。这样做时,是否仍然需要转义基本多语言平面中没有的字符?例如,代替此: 这是

  • 问题内容: 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将包含6个字符的字符串转换为字节时,我将得到如下所示的6个字节,但我希望它是12。是否缺少任何概念? O / p:字符数组的长度为6 根据@Darshan尝试使用UTF-16编码获取字节时,结果也不期望。 问题答案: 在UTF-16版本中,由于插入了一个标记来区分Big Endian(默认)和L

  • 我试图理解Java中的字符编码。Java中的字符使用UTF-16编码以16位存储。因此,当我将一个包含6个字符的字符串转换为字节时,我得到了6个字节,如下所示,我期望它是12。我是不是漏掉了什么概念? O/p:字符数组的长度为6 按照@Darshan的说法,当尝试使用UTF-16编码获取字节时,结果也不是预期的。

  • 我正在使用带有Selenium的testNG。我有两种记录器,一种是log4j记录器,另一种是testNG reporter.log()。现在的问题是我需要记录一些中文文本。但它是作为‘????’而不是中文文本。所以我更改了log4j.properties文件,只添加了两行: 现在,在我的log4j日志中,它是正确的,但在testNG Reporter.log()中,它仍然是“?????”。