UTF-8可以编码多less个字符?

如果UTF-8是8位的,那么不是说最多只能有256个不同的字符?

前128个码点与ASCII码相同。 但是它说UTF-8可以支持多达上百万个字符?

这个怎么用?

UTF-8一直不使用一个字节,它是1到4个字节。

前128个字符(US-ASCII)需要一个字节。

接下来的1,920个字符需要两个字节进行编码。 这涵盖了几乎所有拉丁字母的其余部分,还包括希腊文,西里尔文,科普特文,亚美尼亚文,希伯来文,阿拉伯文,叙利亚文和塔那文字母,以及结合变音符号。

在基本多语言平面的其余部分中,需要三个字节,其中几乎包含所有常用字符[12],包括大多数中文,日文和韩文[CJK]字符。

Unicode的其他平面中的字符需要四个字节,其中包括不常见的CJK字符,各种历史脚本,math符号和表情符号(象形符号)。

来源: 维基百科

UTF-8每个字符使用1-4个字节:一个字节用于ASCII字符(前128个Unicode值与ASCII相同)。 但是这只需要7位。 如果设置了最高(“符号”)位,则表示多字节序列的开始; 连续的高位集合数表示字节数,然后是0,其余的位对该值有贡献。 对于其他字节,最高两位将是1和0,其余6位是该值。

所以一个4字节的序列将以11110 …(… = 3个字节的值)开始,然后是3个字节,每个值为6个位,产生一个21位的值。 2 ^ 21超过了unicode字符的数量,所以所有的unicode都可以用UTF8表示。

2017-07-11:更正了用多个字节编码的相同码点的重复计数

根据这个表 * UTF-8 应该支持:

2 7 + 2 11 + 2 16 + 2 21 + 2 26 + 2 31 = 2,216,757,376个字符

2 31 = 2,147,483,648个字符

但是,RFC 3629限制了可能的值,所以现在我们限制在4字节 ,这给了我们

2 7 + 2 11 + 2 16 + 2 21 = 2,164,864个字符

2 21 = 2,097,152个字符

请注意,这些字符的一大块是“保留”的自定义使用,这实际上是非常方便的图标字体。

*使用维基百科显示一个6字节的表 – 他们已经更新了文章。

UTF-8是一种可变长度编码,每个字符最less 8位。
代码点较高的字符将占用32位。

维基百科的引用:“UTF-8使用一到四个8位字节(在Unicode标准中称为”八位字节“)对Unicode字符集中的1,112,064个代码点进行编码。

一些链接:

查看Unicode标准及相关信息,例如FAQ条目, UTF-8 UTF-16,UTF-32和BOM 。 这不是一帆风顺的,但它是权威性的信息,你可能在其他地方读到的有关UTF-8的许多内容都值得怀疑。

“UTF-8”中的“8”与代码单位的长度有关。 代码单元是用于对字符进行编码的实体,不一定是简单的一对一映射。 UTF-8使用可变数量的代码单元来编码一个字符。

可以用UTF-8编码的字符集合与UTF-16或UTF-32(即所有Unicode字符)完全相同。 他们都编码整个Unicode编码空间,甚至包括非字符和未分配的代码点。

Unicode与UTF-8

Unicode将代码点parsing为字符。 UTF-8是Unicode的存储机制。 Unicode有一个规范。 UTF-8有一个规范。 他们都有不同的限制。 UTF-8具有不同的向上界限。

统一

Unicode被指定为“飞机”。 每架飞机载有2 16个码点。 Unicode有17个平面。 共有17 * 2^16码点。 第一架飞机,即飞机0或BMP ,在载重量上是特殊的。

而不是解释所有的细微差别,让我在飞机上引用上面的文章。

17架飞机可以容纳1,114,112个码点。 其中2048个是代理人,66个是非字符的,137,468个是私人使用的,剩下974,530个用于公共任务。

UTF-8

现在让我们回到上面链接的文章,

UTF-8使用的编码schemedevise了一个更大的2 31个代码点(32,768个平面)的限制,即使限制为4个字节,也可以编码2 21个代码点(32个平面)。 由于Unicode将代码点限制为可由UTF-16编码的17个平面,因此UTF-8和UTF-32中的代码点在0x10FFFF以上无效。

所以你可以看到,你可以把东西放入UTF-8,这是不是有效的Unicode。 为什么? 因为UTF-8容纳Unicode甚至不支持的代码点。

即使是四字节限制,UTF-8也支持2 21个代码点,远远超过了17 * 2^16

2,164,864个“字符”可能被UTF-8编码。

这个数字是来自编码工作方式的2 ^ 7 + 2 ^ 11 + 2 ^ 16 + 2 ^ 21:

  • 1字节的字符有7位用于编码0xxxxxxx

  • 2字节字符有11位用于编码110xxxxx 10xxxxxx

  • 3字节的字符有16位,用于编码1110xxxx 10xxxxxx 10xxxxxx

  • 4字节字符有21位,用于编码11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

正如你所看到的,这比当前的Unicode(1,112,064个字符)大得多。

虽然我同意当前最大的UTF-8编码(2,164,864)(下面列出,我不能评论他),但是如果你删除了UTF-8的两个主要限制,那么他将被closures2个等级:只有4个字节限制和代码254和255不能使用(他只能删除4个字节的限制)。

起始码254遵循起始位的基本排列(多位标志设置为1,计数为6 1,terminal0,没有备用位),给你6个附加字节来处理(6个10xxxxxx组,额外的2 ^ 36码)。

起始码255并不完全遵循基本设置,没有terminal0,但所有的位都被使用,给你7个附加字节(多位标志被设置为1,计数为7 1,并且没有terminal0,因为所有的位都被使用; 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 )。