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

eMR*_*MRe 84 ascii utf-8 character-encoding

如果UTF-8是8位,这是否意味着最多只能有256个不同的字符?

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

这是如何运作的?

zwi*_*pie 121

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

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

接下来的1,920个字符需要两个字节进行编码.这涵盖了几乎所有拉丁字母的其余部分,以及希腊语,西里尔语,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语和Tāna字母表,以及组合变音符号.

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

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

来源:维基百科

  • **UTF-8 可以编码多少个字符?** (3认同)

del*_*ver 36

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

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

  • 在https://softwareengineering.stackexchange.com/questions/262227/why-does-utf-8-waste-several-bits-in-its-encoding中找到答案.出于安全原因(如果流中间的单个字节已损坏) (3认同)

mpe*_*pen 25

根据此表*UTF-8 支持:

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

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

2 21 = 2,097,152个字符

请注意,这些字符的很大一部分是"保留"用于自定义使用,这对于图标字体实际上非常方便.

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

2017-07-11:更正了对使用多个字节编码的相同代码点进行重复计算


Eva*_*oll 18

Unicode与UTF-8

Unicode将代码点解析为字符.UTF-8是Unicode的存储机制.Unicode有一个规范.UTF-8有一个规格.它们都有不同的限制.UTF-8具有不同的向上范围.

统一

Unicode用"飞机"指定.每个平面携带2 16个代码点.Unicode中有17个Planes.总共17 * 2^16代码点.第一个平面,平面0或BMP,在其承载的重量上是特殊的.

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

17架飞机可以容纳1,114,112个码点.其中,2,048个是代理人,66个是非人物,137,468个是私人使用,留下974,530个公共任务.

UTF-8

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

UTF-8使用的编码方案设计具有更大的2 31个代码点(32,768个平面)的限制,并且即使限制为4个字节,也可以编码2 21个代码点(32个平面).[3] 由于Unicode将代码点限制为可由UTF-16编码的17个平面,因此UTF-8和UTF-32中高于0x10FFFF的代码点无效.

所以你可以看到你可以将东西放入UTF-8,这是无效的Unicode.为什么?因为UTF-8适用于Unicode甚至不支持的代码点.

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


Rub*_*yes 15

2,164,864个"字符"可以由UTF-8编码.

这个数字是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 规则,即只允许最短的代码单元序列对代码点进行编码。因此, 00000001 对 U+0001 有效,但 11110000 10000000 10000000 10000001 无效。参考:[表 3-7。格式良好的 UTF-8 字节序列](http://www.unicode.org/versions/Unicode10.0.0/ch03.pdf)。此外,问题直接由表格回答:您只需将范围相加。(它们不相交以排除 UTF-16 的代理)。 (4认同)

dec*_*eze 5

UTF-8是一种可变长度编码,每个字符至少 8位.
代码点较高的字符最多需要32位.

  • 我说代码点可能需要多达32位进行编码,我从未声称(通过归纳)你可以在32位UTF-8中编码2 ^ 32个字符.但这是没有实际意义的,因为你可以用UTF-8编码*全部*现有的Unicode字符,如果你将UTF-8拉伸到48位(存在但不推荐使用),你*可以编码甚至更多,所以我是不确定误导点是什么. (3认同)
  • 这是误导。您可以拥有的最长代码点是[`11110xxx 10xxxxxx 10xxxxxx 10xxxxxx`](https://tools.ietf.org/html/rfc3629),因此仅21位可用于编码实际字符。 (2认同)

ZZ-*_*-bb 5

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

一些链接: