在许多情况下,我发现两者被交替使用,它们是相同的还是不同的?这似乎也取决于语言是否涉及UTF-8(例如Rust)或UTF-16(例如Java / Haskell)。代码点/标量区别是否与编码方案有关?
在许多情况下,我发现两者被交替使用,它们是相同的还是不同的?这似乎也取决于语言是否涉及UTF-8(例如Rust)或UTF-16(例如Java / Haskell)。代码点/标量区别是否与编码方案有关?
首先让我们看一下定义D9、D10和D10a,第3.4节,字符和编码:
D9 Unicode代码空间: 一个范围从0到10FFFF16的整数。
D10 码位: Unicode代码空间中的任何值。
• 码位也称为 代码位置。
...
D10a 码位类型: 标准中的七个基本类别之一: 图形、格式、控制、私用、代理项、非字符、保留。
[强调添加]
好的,码位是在某个范围内的整数。它们被分成称为“码位类型”的类别。
现在让我们看一下定义D76,第3.9节,Unicode编码形式:
D76 Unicode标量值: 除高代理项和低代理项码位外的任何Unicode码位。
• 由于这个定义,Unicode标量值的集合包括范围从0到D7FF16和E00016 到10FFFF16,包括这些值。
在第3.8节的D76之前,定义并解释了代理项。要点是代理项分为两类:高代理项和低代理项。这些仅由UTF-16使用,以便表示所有标量值。(有1,112,064个标量值,但216=65536远小于这个数目。) UTF-8没有这个问题;它是一种可变长度编码方案(代码点可以是1-4个字节长),因此它可以容纳所有标量而不使用代理项。
总结:代码点是标量或代理项。从最抽象的意义上讲,代码点只是一个数字;如何将该数字编码为二进制形式是一个单独的问题。UTF-16使用代理对,因为它不能直接表示所有可能的标量。UTF-8不使用代理对。
在将来,您可能会发现查阅Unicode词汇表很有帮助。它包含许多经常使用的定义,以及指向Unicode规范中定义的链接。