unicode - 为什么 unicode 代码点的 UTF-8 编码不能放入 3 个字节

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/

相关文章:

scala - 如何测量 Cats IO 效果中的耗时?

django - 从 Django 模型中的选择中获取人类可读名称的实际值

c++ - 为什么 mersenne_twister_engine 保证某些结果?

xamarin - 使用 xamarin 表单从页面中删除向后滑动手势

angular - NgRx - 从后端获取错误验证并传递给组件

r - 从分布到置信区间的寓言

arrays - Julia - 许多分配以浏览结构中的数组

spring-boot - 如何将base64转换为java中的MultipartFile

scala - 使用 Scala 将多列转换为 Spark Dataframe 上的一列 map

haskell - 了解如何应用 haskell 应用仿函数