我要求计算 Unicode 中所有可能的有效组合并附上解释。我知道一个 char 可以编码为 1、2、3 或 4 个字节。我也不明白为什么连续字节有限制,即使那个字符的起始字节清除了它应该有多长。
6 回答
我要求计算 Unicode 中所有可能的有效组合并附上解释。
1,111,998:17 个平面 × 每个平面 65,536 个字符 - 2048 个代理项 - 66 个非字符
请注意,UTF-8 和 UTF-32 理论上可以编码远多于 17 个平面,但范围受到UTF-16 编码的限制。
Unicode 12.1中实际分配了137,929 个代码点。
我也不明白为什么连续字节有限制,即使那个字符的起始字节清除了它应该有多长。
UTF-8 中这种限制的目的是使编码自同步。
举个反例,考虑中文GB 18030 编码。在那里,字母ß
表示为字节序列81 30 89 38
,其中包含数字0
和的编码8
。因此,如果您有一个不是为这种特定于编码的怪癖而设计的字符串搜索功能,那么对 digit 的搜索8
将在 letter 中发现误报ß
。
在 UTF-8 中,这不会发生,因为前导字节和尾随字节之间的不重叠保证了较短字符的编码永远不会发生在较长字符的编码中。
Unicode 允许 17 个平面,每个平面有 65,536 个可能的字符(或“代码点”)。这给出了总共 1,114,112 个可能的字符。目前,仅分配了大约 10% 的空间。
这些代码点如何编码的确切细节与编码不同,但您的问题听起来像是您在考虑 UTF-8。限制连续字节的原因大概是这样很容易找到下一个字符的开头(因为连续字符总是采用 10xxxxxx 的形式,但起始字节永远不会是这种形式)。
Unicode 支持 1,114,112 个代码点。有 2048 个代理代码点,给出 1,112,064 个标量值。其中,有 66 个非字符,导致 1,111,998 个可能的编码字符(除非我计算错误)。
根据维基百科,Unicode 12.1(2019 年 5 月发布)包含 137,994 个不同的字符。
为了给出一个隐喻准确的答案,all of them
.
UTF-8 编码中的连续字节允许在面对“线路噪声”时重新同步编码的八位字节流。编码器只需要向前扫描一个在 0x80 和 0xBF 之间没有值的字节,就知道下一个字节是新字符点的开始。
从理论上讲,今天使用的编码允许表达 Unicode 字符数最多为 31 位的字符。实际上,这种编码实际上是在 Twitter 等服务上实现的,其中最大长度的推文可以编码多达 4,340 位的数据。(140 个字符 [有效和无效],每个乘以 31 位。)
Unicode 的十六进制数是 110000,即 1114112