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

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

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

这是怎么回事?

120786 次浏览

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

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

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

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

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

来源: 维基百科

UTF-8是 可变长度编码,最低限度为每个字符8位。
具有较高编码点的字符将占用最多32位。

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

有关连结:

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

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

查阅 Unicode 标准及相关信息,例如其常见问题解答条目 UTF-8 UTF-16 UTF-32 & BOM。这不是一帆风顺,但它是权威的信息,您可能在其他地方读到的关于 UTF-8的大部分内容是值得怀疑的。

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

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

根据 这张桌子 * UTF-8 应该的支持:

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

然而,RFC3629限制了可能的值,所以现在我们是 上限为4字节,这给了我们什么

221 = 2,097,152个字符

请注意,这些字符中有很大一部分是“保留”给自定义使用的,这对于图标字体来说实际上非常方便。

* Wikipedia 使用显示一个6字节的表——他们已经更新了文章。

2017-07-11: 修正了以多字节编码的重复计算同一编码点的错误

虽然我同意 mpen 关于目前最大 UTF-8代码(2,164,864)(下面列出,我不能评论他的) ,但是如果你去掉 UTF-8的两个主要限制,他就偏离了两个级别: 只有4个字节的限制和代码254和255不能使用(他只去掉了4个字节的限制)。

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

起始代码255并不完全遵循基本的设置,没有终端0,但是使用了所有的位,给你7个额外的字节(多位标志设置为1,计数为71,没有终端0,因为使用了所有的位; 710xxxxxx 组,一个额外的2 ^ 42个代码)。

添加这些字符后,最终的最大可呈现字符集为4,468,982,745,216。这超过了目前使用的所有字符,古老或死亡的语言,以及任何被认为丢失的语言。有天使或者天使的剧本吗?

此外,在 UTF-8标准中,除了254和255:128-191以及其他一些标准之外,还有一些单字节码被忽略/忽略。有些是本地使用的键盘,示例代码128通常是一个删除退格。由于一个或多个原因(https://en.wikipedia.org/wiki/UTF-8#Invalid_byte_sequences) ,其他起始代码(和相关的范围)无效。

Unicode VS UTF-8

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

Unicode

Unicode 由 “飞机”指定,每个平面携带216编码点。Unicode 中有17个平面。对于总的 17 * 2^16代码点。第一个平面,平面0或 BMP的特别之处在于它承载的重量。

与其解释所有的细微差别,不如让我引用上面关于飞机的文章。

这17架飞机可以容纳1,114,112个编码点。其中,2,048个是代理,66个是非字符,137,468个保留给私人使用,剩下974,530个留给公共分配。

UTF-8

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

UTF-8使用的编码方案设计了一个更大的231编码点(32,768平面)的限制,即使限制在4字节,也可以编码221编码点(32平面)。[3]由于 Unicode 将编码点限制在可以用 UTF-16编码的17个平面,因此在 UTF-8和 UTF-32中,0x10FFFF 以上的编码点是无效的。

因此,您可以看到可以将不是有效 Unicode 的内容放入 UTF-8中。为什么?因为 UTF-8包含 Unicode 甚至不支持的代码点。

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

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

这个数字是 27 + 211 + 216 + 221,它来自于编码的工作方式:

  • 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个字符)大得多。

更新

我最初的计算是错误的,因为它没有考虑额外的规则。

Unicode 与 UTF-8紧密结合。Unicode 特别支持2 ^ 21个代码点(2,097,152个字符) ,这与 UTF-8支持的代码点数目完全相同。两个系统保留相同的“死”空间和代码点的限制区等。... 截至2018年6月,最新版本 Unicode 11.0包含了137,439个字符

来自 Unicode 标准。 < a href = “ https://www.Unicode.org/FAQ/utf _ Bom.html”rel = “ nofollow noReferrer”> Unicode FAQ

Unicode 标准对 U + 0000. . U + 10 FFFF 范围内的字符进行编码, 相当于一个21位的代码空间。

摘自 UTF-8 Wikipedia 页面。 < a href = “ https://en.Wikipedia.org/wiki/UTF-8 # Description”rel = “ nofollow noReferrer”> UTF-8 Description

中将 Unicode 代码空间限制为21位值 2003年,UTF-8被定义为以一到四个字节为单位编码代码点,..。