如果UTF-8是8位,这是否意味着最多只能有256个不同的字符?
前128个代码点与ASCII中的相同。但是它说UTF-8最多可以支持百万个字符吗?
这是如何运作的?
如果UTF-8是8位,这是否意味着最多只能有256个不同的字符?
前128个代码点与ASCII中的相同。但是它说UTF-8最多可以支持百万个字符吗?
这是如何运作的?
Answers:
UTF-8不会一直使用一个字节,而是1到4个字节。
前128个字符(US-ASCII)需要一个字节。
接下来的1,920个字符需要两个字节进行编码。这涵盖了几乎所有拉丁字母的其余部分,以及希腊语,西里尔字母,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语和塔纳语字母,以及组合变音符号。
在基本多语言平面的其余部分中,字符需要三个字节,其中几乎包含了所有常用的字符[12],包括大多数中文,日文和韩文[CJK]字符。
Unicode其他平面中的字符需要四个字节,其中包括较少见的CJK字符,各种历史脚本,数学符号和表情符号(象形符号)。
资料来源:维基百科
UTF-8每个字符使用1-4个字节:一个字节用于ascii字符(前128个unicode值与ascii相同)。但这仅需要7位。如果设置了最高(“符号”)位,则表明多字节序列的开始;否则,它指示多字节序列的开始。设置的连续高位位数表示字节数,然后为0,其余位为该值。对于其他字节,最高两位为1和0,其余6位为该值。
因此,一个四个字节的序列将从11110 ...(和... =该值的三位)开始,然后是三个字节,每个值具有6位,从而产生21位的值。2 ^ 21超出了unicode字符的数量,因此所有unicode都可以用UTF8表示。
0xxxxxxx
给出7个可用位,再110xxxxx 10xxxxxx
给出11个-没有重叠。第0
一种情况的第一个字节以1
第二种情况开头。
00000001
存储什么代码点以及11000000 100000001
存储什么?
Unicode将代码点解析为字符。UTF-8是Unicode的存储机制。Unicode有一个规范。UTF-8有一个规格。它们都有不同的限制。UTF-8具有不同的上界。
Unicode用“平面”指定。每架飞机上载有2 个16码点。Unicode中有17个平面。共计17 * 2^16
代码点。第一个平面,即平面0或BMP,在承载重量方面是特殊的。
除了解释所有细微差别外,我只引用飞机上的上述文章。
这17架飞机可以容纳1,114,112个代码点。其中,有2,048个是代理人,有66个是非字符,还有137,468个供私人使用,剩下974,530个用于公共任务。
现在,让我们回到上面链接的文章,
UTF-8使用的编码方案的最大限制是2 31个代码点(32,768个平面),即使限制为4个字节,也可以编码2个21个代码点(32个平面)。[3] 由于Unicode将代码点限制为可以由UTF-16编码的17个平面,因此0x10FFFF以上的代码点在UTF-8和UTF-32中无效。
因此,您可以看到您可以将不是有效Unicode的内容放入UTF-8。为什么?因为UTF-8可以容纳Unicode甚至不支持的代码点。
UTF-8即使有四个字节的限制,也支持2 21个代码点,这远远超过了17 * 2^16
UTF-8可能会编码2,164,864个“字符”。
这个数字是2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21,它来自编码的工作方式:
1个字节的字符有7位用于编码
0xxxxxxx
(0x00-0x7F)
2个字节的字符具有11个编码位
110xxxxx 10xxxxxx
(第一个字节为0xC0-0xDF;第二个字节为0x80-0xBF)
3字节字符具有16位编码
1110xxxx 10xxxxxx 10xxxxxx
(第一个字节为0xE0-0xEF;连续字节为0x80-0xBF)
4字节字符有21位用于编码
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(第一个字节为0xF0-0xF7;连续字节为0x80-0xBF)
如您所见,它远大于当前的Unicode(1,112,064个字符)。
更新
我的初始计算是错误的,因为它没有考虑其他规则。有关更多详细信息,请参见对此答案的评论。
UTF-8是可变长度编码,每个字符最少 8位。
具有更高代码点的字符最多需要32位。
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
,因此只能使用21位来编码实际字符。
引自维基百科:“ UTF-8使用1到4个8位字节(在Unicode标准中称为“八位字节”)对Unicode字符集中的1,112,064个代码点进行编码。
一些链接:
查看Unicode标准和相关信息,例如FAQ条目,UTF-8 UTF-16,UTF-32和BOM。这并非一帆风顺,而是权威信息,您可能在其他地方所读到的有关UTF-8的许多内容都值得商question。
“ UTF-8”中的“ 8”与以位为单位的代码单位的长度有关。代码单位是用于编码字符的实体,不一定是简单的一对一映射。UTF-8使用可变数量的代码单元来编码字符。
可以用UTF-8编码的字符集合与UTF-16或UTF-32完全相同,即所有Unicode字符。它们都对整个Unicode编码空间进行编码,甚至包括非字符和未分配的代码点。
尽管我同意mpen的当前最大UTF-8代码(2,164,864)(在下面列出,我无法对他进行评论),但是如果您删除了UTF-8的2个主要限制,他的等级将降低2级:仅4个字节限制和代码254和255不能使用(他只删除了4个字节的限制)。
起始代码254遵循起始位(将多位标志设置为1,计数为6 1的计数,以及终端0,无备用位)的基本安排,为您提供了6个额外的字节以供使用(6个10xxxxxx组,另外2个^)。 36个代码)。
起始代码255并非完全遵循基本设置,没有使用终端0,而是使用了所有位,从而为您提供了7个附加字节(多位标志设置为1,计数为7 1,并且由于使用了所有位,所以没有终端0 ; 7个10xxxxxx组,另外还有2 ^ 42个代码)。
将它们加在一起,得出的最终最大可显示字符集为4,468,982,745,216。这比当前使用的所有字符,旧的或无效的语言以及任何相信的丢失语言都重要。天使或天体剧本?
除了254和255:128-191以及其他一些以外,还有一些在UTF-8标准中被忽略/忽略的单字节代码。有些是由键盘在本地使用的,示例代码128通常是一个删除的退格键。其他起始代码(及相关范围)由于一个或多个原因(https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences)而无效。
Unicode与UTF-8紧密相连。Unicode特别支持2 ^ 21个代码点(2,097,152个字符),这与UTF-8支持的代码点数完全相同。两种系统都保留相同的“死区”空间和代码点等限制区域。...截至2018年6月,最新版本Unicode 11.0包含137,439个字符
来自unicode标准。 Unicode常见问题
Unicode标准对U + 0000..U + 10FFFF范围内的字符进行编码,这相当于21位代码空间。
从UTF-8 Wikipedia页面。 UTF-8说明
由于在2003年将Unicode代码空间限制为21位值,因此定义了UTF-8以将代码点编码为一到四个字节,...