Wikipedia
Unicode comprises 1,114,112 code points in the range 0hex to 10FFFFhex
我对 unicode 编码最多可以占用 4 个字节感到困惑。 1,114,112 个代码点不能轻松地放在 3 个字节中吗?可能是我遗漏了一些需要 4 个字节的特殊情况;请提供一些具体示例(如果有的话)?
最佳答案
维基百科关于历史的文章 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
现在 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
现在您有足够的空间来编码所有 21 位代码点。但这是一种全新的编码,因此您必须在全局范围内建立这种编码。以 Unicode 的经验来看,大概需要 20 年的时间。祝你好运。
https://stackoverflow.com/questions/54795313/