为什么 unicode 代码点的 UTF-8 编码不能容纳在 3 个字节中

Sat*_*rpa 3 unicode

维基百科

Unicode 包含 1,114,112 个代码点,范围为 0hex 到 10FFFFhex

我对 unicode 编码最多可以占用 4 个字节感到有点困惑。难道 3 个字节不能轻松容纳 1,114,112 个代码点吗?可能我遗漏了一些需要 4 个字节的特殊情况;请举一些具体的例子(如果有的话)?

Rol*_*lig 5

维基百科关于UTF-8历史的文章称,UTF-8 的早期版本允许编码超过 21 位。这些编码占用 5 甚至 6 个字节。

在明确 2^21 个代码点可能足以满足人类剩余的时间之后(与 5 位、6 位、7 位、8 位和 16 位的想法相同),5 和 6 字节的编码是简直是被禁止的。为了向后兼容,保留所有其他编码规则。

因此,Unicode 代码点的数字空间现在为 0..10FFFF,甚至略小于 21 位。因此,可能值得检查这 21 位是否适合 3 个字节的 24 位,而不是当前的 4 个字节。

UTF-8 的一个重要属性是,作为多字节编码一部分的每个字节都有其最高位集。为了区分前导字节和尾随字节,前导字节设置了第二高位,而尾随字节则清除了第二高位。此属性可确保顺序一致。因此,字符可以这样编码:

0xxx_xxxx                        7 bits freely chooseable
110x_xxxx 10xx_xxxx             11 bits freely chooseable
1110_xxxx 10xx_xxxx 10xx_xxxx   16 bits freely chooseable
Run Code Online (Sandbox Code Playgroud)

现在 7 + 11 + 16 位 = 16.04 位,这比所需的 21 位要短得多。因此,根据当前 UTF-8 编码规则,使用最多 3 个字节对所有 Unicode 代码点进行编码是不可能的。

您可以定义另一种编码,其中每个字节的最高位是连续位:

0xxx_xxxx                        7 bits freely chooseable
1xxx_xxxx 0xxx_xxxx             14 bits freely chooseable
1xxx_xxxx 1xxx_xxxx 0xxx_xxxx   21 bits freely chooseable
Run Code Online (Sandbox Code Playgroud)

现在您有足够的空间来编码所有 21 位代码点。但这是一种全新的编码,因此您必须在全球范围内建立这种编码。根据Unicode的经验,大约需要20年的时间。祝你好运。