首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >UTF-16编码是如何使用代理代码点的?

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

Stack Overflow用户
提问于 2021-03-12 18:37:20
回答 2查看 247关注 0票数 2

根据Unicode规范的说法

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

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

然而,“标量值”一词的定义如下:

D76 Unicode标量值:除高代理项和低代理码点以外的任何Unicode代码点.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-03-12 19:40:27

是的,Unicode代理代码点的准备金范围:

Unicode保留这些范围,因为这些16位值用于代理项对,而其他符号不能分配给它们。代理项对是两个16位值,它们编码U+FFFF以上的不适合单个16位值的点。

票数 2
EN

Stack Overflow用户

发布于 2021-03-14 13:34:42

只是为了最终的澄清。

  • 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?
  • Unicode规范倾向于更好的方式。如果需要编码范围U+10000..U+10FFF (1048576个代码点),那么我们应该将1024+1024=2048值与那些可以用16位编码的值分开(规范为它选择了D800..DFFF范围)。当一个互感器在计算机内存中计算一个D800..DBFF (高代理面积)值时,它知道它不是隐含的“完全”代码点(在规范中不是标量值),它应该再读取16位来从DC00..DFFF范围(低代理区域)中得到值,并最终得出哪一个U+10000..U+10FFF代码点是用这4个字节编码的(用这个代理项对)。请注意,这样的方案可以编码1 024 *1 024 =1 048等量的576个代码点(这是我们所需要的数量)。
  • 由于Unicode代码空间被定义为从0到10 10FFFF之间的整数范围,我们必须引入代理代码点(而不是代码单位)的概念-- U+D800..U+DBFF范围(因为我们不能从unicode代码空间中排除这个范围)。考虑到代理代码点是为UTF-16中的代理代码单元指定的(参见C1,D74),这些代码点可以看作是UTF-16的遗物。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66605467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档