Unicode 码位和 Unicode 标量有什么区别?



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

首先,让我们看一下定义 D9、D10 和 D10a,第 3.4 节, 字符和编码:

D9Unicode 代码空间: 从 0 到 10FFFF16的整数范围。

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

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

D10a码位类型: 标准中七类基本代码点中的任何一: 图形、格式、控件、专用、代理、非字符、保留

[着重号后加]

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

现在让我们看一下定义 D76, 第 3.9 节, Unicode 编码形式:

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

• 由于此定义,Unicode 标量值集由范围 0 到 D7FF 16 和 E000 16 到 10FFFF 16(包括 0 到 D7FF16)组成。

代理人在第 3.8 节中定义和解释,就在 D76 之前。要点是代理人分为两类高代理人和低代理人。这些仅由 UTF-16 使用,以便它可以表示所有标量值。(有 1,112,064 个标量,但 216= 65536 比这少得多。 UTF-8 没有这个问题;它是一种可变长度编码方案(代码点长度可以是 1-4 个字节),因此它可以在不使用代理项的情况下对所有标量进行编码。

摘要:代码点可以是标量或代理项。码位只是最抽象意义上的数字;如何将该数字编码为二进制形式是一个单独的问题。UTF-16 使用代理项对,因为它不能直接表示所有可能的标量。UTF-8 不使用代理项对。

将来,您可能会发现查阅 Unicode 词汇表很有帮助。它包含许多常用的定义,以及指向 Unicode 规范中定义的链接。

最新更新