使用Unicode可以映射多少个字符?

使用Unicode可以映射多少个字符?,unicode,utf-8,utf,Unicode,Utf 8,Utf,我要的是Unicode中所有可能的有效组合的计数,并给出解释。我知道字符可以编码为1、2、3或4字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它的长度。根据,Unicode 12.1(于2019年5月发布)包含137994个不同的字符。Unicode允许17个,每个65536个可能的字符(或“代码点”)。这将提供总共1114112个可能的字符。目前,只有大约10%的空间已分配 这些代码点编码方式的具体细节与编码方式不同,但您的问题听起来像是在考虑UTF-8。限制延续字节的原因大

我要的是Unicode中所有可能的有效组合的计数,并给出解释。我知道字符可以编码为1、2、3或4字节。我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它的长度。

根据,Unicode 12.1(于2019年5月发布)包含137994个不同的字符。

Unicode允许17个,每个65536个可能的字符(或“代码点”)。这将提供总共1114112个可能的字符。目前,只有大约10%的空间已分配


这些代码点编码方式的具体细节与编码方式不同,但您的问题听起来像是在考虑UTF-8。限制延续字节的原因大概是为了很容易找到下一个字符的开头(因为延续字符总是10xxxxxx的形式,但起始字节永远不能是这种形式)。

为了给出一个隐喻性的准确答案,
所有这些字符都是

UTF-8编码中的连续字节允许在面对“线路噪声”时重新同步编码的八位字节流。编码器只需向前扫描一个值不在0x80和0xBF之间的字节,即可知道下一个字节是新字符点的开始


理论上,今天使用的编码允许Unicode字符数长度达到31位的字符表达。实际上,这种编码实际上是在Twitter等服务上实现的,在Twitter中,最大长度的tweet可以编码多达4340位的数据。(140个字符[有效和无效],每个字符乘以31位。)

Unicode支持1114112个代码点。有2048个代理代码点,给出1112064个标量值。其中,有66个非字符,导致1111998个可能的编码字符(除非我有计算错误)

我要的是Unicode中所有可能的有效组合的计数,并给出解释

1111998:17个平面×每个平面65536个字符-2048个代理-66个非字符

请注意,UTF-8和UTF-32理论上可以编码17个以上的平面,但范围受到限制

137929代码点实际上是在中分配的

我也不明白为什么连续字节有限制,即使该字符的起始字节清除了它应该有多长

UTF-8中此限制的目的是进行编码

作为反例,考虑中国人。在这里,字母
ß
表示为字节序列
81 30 89 38
,其中包含数字
0
8
的编码。因此,如果您的字符串搜索功能不是针对这种编码特定的怪癖而设计的,那么对数字
8
的搜索将在字母
ß
中发现假阳性


在UTF-8中,这是不可能发生的,因为前导字节和尾随字节之间的不重叠保证了较短字符的编码永远不会发生在较长字符的编码中。

Unicode的十六进制数为110000,根据这些“平面”,即1114112

即使是4字节字符的最后3个字节也可以表示其中的64个。我错了吗?是的,那是为了同步,看,我想那已经过时了。它不使用6个字节anymore@Andy:这很有道理:UTF-8的原始规范适用于更大的数字。21位限制是对那些将自己锁定在16位字符中的人的一种安慰,因此UCS-2产生了被称为UTF-16的讨厌的东西。@Simon:有34个非字符代码点,当按位添加0xFFFE==0xFFFE时,每个平面有两个这样的代码点。此外,在0x00_FDD0范围内还有31个非字符代码点。。0x00_FDEF。另外,您应该从中减去代理项,由于UTF-16缺陷,代理项对于开放交换是不合法的,但必须在您的程序中得到支持。实际上,理论上它不限于31位,您可以在64位机器上进行更大的操作
perl-le'print ord“\x{1FFF_FFFF_FFFF}”
在64位机器上打印出35184372088831,但在32位机器上产生整数溢出。您可以在perl程序中使用更大的字符,但如果您尝试将它们打印为utf8,则会得到一个强制警告,除非禁用这样的命令:
perl-le'print“\x{1FFF_FFFF}”代码点0x1ffffff不是Unicode,可能无法在-e第1行移植######。“松散utf8”和“严格UTF-8”之间有一个区别:前者不受限制。今天使用的编码不允许31位标量值。UTF-32允许32位值,UTF-8允许更多,但UTF-16(Windows、OS X、Java、.NET、Python内部使用,因此是最流行的编码方案)允许略多于一百万(这仍然足够)。“所有这些”都不太准确;传统编码中有一些字符不是Unicode格式的。例如,MacRoman中的苹果徽标和ATASCII中的几个图形字符。OTOH,有一个私人使用区域,所以这些字符可以用Unicode进行映射;它们不是标准的一部分。@tchrist:python3使用UTF-16;例如,在我的系统上,我可以说
len(chr(0x10000))
,给出2(代码单位)。OS X的内核使用UTF-8,没错,但是高级API(Cocoa等)使用UTF-16。@Philip:我只使用Python 2,它的Unicode支持还有很多需要改进的地方。我是一个系统人员,所以我不做最终用户的chrome platting:我在OSX上使用的所有系统调用都使用UTF-8,内核会为您将其转换为NFC。我在Java中的UTF-16体验很糟糕:尝试一个带有括号的正则表达式的charclass匹配,在它们的文本中有一些非BMP代码点,比如
[@Ufuk:Unicode没有字符。它有代码点。Som