Unicode代码点和Unicode标量之间有什么区别?

时间:2018-01-26 16:15:16

标签: unicode

我看到两者在很多情况下可以互换使用(看似) - 它们是相同还是不同?这似乎也取决于语言是在谈论UTF-8(例如Rust)还是UTF-16(例如Java / Haskell)。代码点/标量的区别是否依赖于编码方案?

1 个答案:

答案 0 :(得分:7)

首先让我们看一下definitions D9, D10 and D10a, Section 3.4, Characters and Encoding

  

D9 Unicode代码空间:    从0到10FFFF 16 的整数范围。

     

D10 代码点:   Unicode代码空间中的任何值。

     

•代码点也称为a   代码位置。

     

...

     

D10a 代码点类型:   标准中任何七个基本类代码点:   图形,格式,控制,私人使用,代理,非特征,保留。

     

[强调补充]

好的,所以代码点是一定范围内的整数。它们分为称为"代码点类型"。

现在让我们看一下definition D76, Section 3.9, Unicode Encoding Forms

  

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

     

•作为此定义的结果,Unicode标量值的集合包含范围0到D7FF 16 和E000 16   到10FFFF 16 ,包括在内。

在D76之前的3.8节中定义并解释了代理人。故事的要点是代理人分为高代理人和低代理人两类。它们仅由UTF-16使用,因此它可以表示所有代码点。 (有1,114,112个代码点,但2 16 = 65536远小于此。) UTF-8没有这个问题;它是一种可变长度编码方案(代码点可以是1-4个字节长),因此它可以容纳所有代码点而无需使用代理。

摘要:代码点是标量或代理。这纯粹是一个"整数分类",它没有提到编码方案。 UTF-16使用代理对,因为它不能直接表示所有可能的代码点。 UTF-8不使用代理对。

将来,您可能会发现咨询Unicode glossary很有帮助。它包含许多常用定义,以及Unicode规范中定义的链接。