我要求计算Unicode中所有可能有效组合的数量,附带说明。我知道一个字符可以编码为1、2、3或4个字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清楚表明它的长度。
ß
表示为字节序列81 30 89 38
,其中包含数字0
和8
的编码。因此,如果您有一个未针对此编码特定问题设计的字符串搜索函数,则搜索数字8
将在字母ß
内产生误报。Unicode支持1,114,112个码点。有2048个代理码点,共有1,112,064个标量值。其中有66个非字符,导致可能编码的字符数为1,111,998(除非我计算错误)。
用一个比喻来回答,所有的
。
UTF-8编码中的连续字节允许在“线路噪声”的情况下重新同步编码的八位字节流。编码器只需向前扫描一个没有0x80到0xBF之间值的字节,就可以知道下一个字节是新字符点的开始。
理论上,今天使用的编码允许表达Unicode字符号长达31位。实际上,在像Twitter这样的服务中实现了这种编码,最大长度的推文可以编码高达4,340位的数据。(140个字符[有效和无效],每个字符31位。)
perl -le 'print ord "\x{1FFF_FFFF_FFFF}"'
在64位机器上输出35184372088831,但在32位机器上会出现整数溢出。您可以在perl程序中使用更大的字符,但如果尝试将它们作为utf8打印出来,则会得到强制警告,除非您禁用此类警告:perl -le 'print"\x{1FFF_FFFF}"'
。 0x1FFFFFFF代码点不是Unicode,可能不可移植。 “松散的UTF-8”和“严格的UTF-8”之间存在差异:前者没有限制。 - tchristlen(chr(0x10000))
,得到2(代码单元)。OS X的内核使用UTF-8,但高级API(Cocoa等)使用UTF-16。 - Philipp[-]
,你就会明白为什么我认为暴露UTF-16编码是一个失败的尝试。让程序员思考编码形式而不是逻辑字符是一个错误。 - tchristUnicode 的十六进制数为 110000,即 1114112。