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