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

36

在许多情况下,我发现两者被交替使用,它们是相同的还是不同的?这似乎也取决于语言是否涉及UTF-8(例如Rust)或UTF-16(例如Java / Haskell)。代码点/标量区别是否与编码方案有关?

1个回答

42

首先让我们看一下定义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规范中定义的链接。


2
UTF-8编码可以是1到4个字节长,并分别表示最大7位、11位、16位或21位的代码点。否则,问题很好,自问自答:^) - Mark Tolonen
糟糕,好发现!我在脑海中直接将1-4(8位)字节转换为位数。当然,那是不正确的。 - typesanitizer
1
这些仅由UTF-16使用,以便它可以表示所有的代码点 - 根据定义,我认为应该是“以便它可以表示所有的Unicode标量”,因为它不能表示对应于代理项本身的码位。 - user17789309

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接