我要求解释所有Unicode中所有可能有效组合的数量。我知道一个char可以编码为1,2,3或4个字节。即使该char的起始字节清除了应该多长时间,我也不明白为什么连续字节有限制。
我要求解释所有Unicode中所有可能有效组合的数量。我知道一个char可以编码为1,2,3或4个字节。即使该char的起始字节清除了应该多长时间,我也不明白为什么连续字节有限制。
Answers:
我要求解释所有Unicode中所有可能有效组合的数量。
1,111,998:17个平面×每个平面65,536个字符-2048个替代-66个非字符
请注意,理论上UTF-8和UTF-32可以编码的平面远远超过17个,但是范围受UTF-16编码的限制。
实际上,在Unicode 12.1中分配了137,929个代码点。
即使该char的起始字节清除了应该多长时间,我也不明白为什么连续字节有限制。
UTF-8中此限制的目的是使编码自同步。
作为反例,请考虑中文GB 18030编码。在那里,字母ß
表示为字节序列81 30 89 38
,其中包含数字0
和的编码8
。因此,如果您的字符串搜索功能不是为此特定于编码的怪癖设计的,则搜索数字8
将在字母中找到误报ß
。
在UTF-8中,这不会发生,因为前导字节和尾部字节之间的非重叠保证了较短字符的编码永远不会在较长字符的编码内发生。
Unicode支持1,114,112个代码点。有2048个代理代码点,给出1,112,064个标量值。其中有66个非字符,导致1,111,998个可能的编码字符(除非我计算错误)。
要给出一个隐喻性的准确答案,all of them
。
UTF-8编码中的连续字节允许面对“线噪声”重新编码的八位位组流。编码器只需要向前扫描一个字节,该字节的值在0x80到0xBF之间,就可以知道下一个字节是新字符点的开始。
从理论上讲,今天使用的编码允许表达Unicode字符数最多为31位长度的字符。实际上,这种编码实际上是在Twitter之类的服务上实现的,其中推文的最大长度可以编码多达4340位的数据。(140个字符[有效和无效],每个乘以31位。)
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
在64位计算机上打印35184372088831,但在32位计算机上给出整数溢出。您可以在perl程序中使用更大的字符,但是如果尝试将它们打印为utf8,除非禁用了以下命令,否则会收到强制性警告perl -le 'print "\x{1FFF_FFFF}"' Code point 0x1FFFFFFF is not Unicode, may not be portable at -e line 1. ######
。“宽松的utf8”和“严格的UTF-8”之间是有区别的:前者不受限制。
len(chr(0x10000))
,给出2(代码单位)。OS X的内核使用正确的UTF-8,但是高级API(可可等)使用UTF-16。
[𝒜-𝒵]
,您会明白为什么我发现将UTF-16暴露为缺陷。使程序员思考编码形式而不是逻辑字符是错误的。
Unicode的十六进制数为110000,即1114112
根据Wikipedia的说法,Unicode 12.1(于2019年5月发布)包含137,994个不同的字符。