如果UTF-8是8位,是否意味着最多只能有256个不同的字符?
前128个代码点与ASCII相同。但它说UTF-8可以支持多达百万个字符?
这是如何运作的?
答案 0 :(得分:109)
UTF-8不会一直使用一个字节,它是1到4个字节。
前128个字符(US-ASCII)需要一个字节。
接下来的1,920个字符需要两个字节进行编码。这涵盖了几乎所有拉丁字母的其余部分,以及希腊语,西里尔语,科普特语,亚美尼亚语,希伯来语,阿拉伯语,叙利亚语和Tāna字母表,以及组合变音符号。
基本多语言平面的其余部分中的字符需要三个字节,其中几乎包含所有常用字符[12],包括大多数中文,日文和韩文[CJK]字符。
Unicode的其他平面中的字符需要四个字节,其中包括不太常见的CJK字符,各种历史脚本,数学符号和表情符号(象形符号)。
来源:Wikipedia
答案 1 :(得分:34)
UTF-8每个字符使用1-4个字节:ascii字符为一个字节(前128个unicode值与ascii相同)。但这只需要7位。如果设置了最高(“符号”)位,则表示多字节序列的开始;连续高位设置的数量表示字节数,然后是0,其余位表示该值。对于其他字节,最高的两位将为1和0,其余6位用于该值。
因此,一个四字节序列将以11110 ...(和...... =该值的三个位)开始,然后是三个字节,每个值为6位,产生一个21位值。 2 ^ 21超过了unicode字符的数量,因此所有的unicode都可以用UTF8表示。
答案 2 :(得分:22)
根据this table * UTF-8 应该支持:
2 31 = 2,147,483,648个字符
然而,RFC 3629限制了可能的值,所以现在我们capped at 4 bytes,这给了我们
2 21 = 2,097,152个字符
请注意,这些字符的很大一部分是"保留"用于自定义使用,这对于图标字体来说实际上非常方便。
*使用的维基百科显示了一个包含6个字节的表 - 他们自更新文章以来已经过了。
2017-07-11:更正了对使用多个字节编码的相同代码点进行重复计算
答案 3 :(得分:12)
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个字符)。
答案 4 :(得分:11)
Unicode将代码点解析为字符。 UTF-8是Unicode的存储机制。 Unicode有一个规范。 UTF-8有一个规格。它们都有不同的限制。 UTF-8具有不同的向上界限。
Unicode用"planes."指定。每个平面带有2个 16 代码点。 Unicode中有17个Planes。总共17 * 2^16
个代码点。 first plane, plane 0 or the BMP,特别在于它的重量。
不要解释所有的细微差别,让我在飞机上引用上面的文章。
17架飞机可以容纳1,114,112个码点。其中,2,048个是代理人,66个是非人物,137,468个是私人使用,留下974,530个公共任务。
现在让我们回到上面链接的文章,
UTF-8使用的编码方案设计有2个 31 代码点(32,768个平面)的更大限制,并且可以编码2个 21 代码点( 32个平面)即使限制为4个字节。[3]由于Unicode将代码点限制为可由UTF-16编码的17个平面,因此UTF-8和UTF-32中高于0x10FFFF的代码点无效。
所以你可以看到你可以将东西放入UTF-8,这是无效的Unicode。为什么?因为UTF-8适用于Unicode甚至不支持的代码点。
UTF-8,即使有四个字节的限制,也支持2个 21 代码点,远远超过17 * 2^16
答案 5 :(得分:6)
UTF-8是可变长度编码,每个字符的最小为8位。
代码点较高的字符最多需要32位。
答案 6 :(得分:3)
来自维基百科的引用:“UTF-8使用一到四个8位字节(在Unicode标准中称为”八位字节“)对Unicode字符集中的1,112,064个代码点中的每一个进行编码。”
一些链接:
答案 7 :(得分:2)
查看Unicode标准及相关信息,例如FAQ条目UTF-8 UTF-16, UTF-32 & BOM。这不是一帆风顺,但它是权威的信息,而你在其他地方读到的关于UTF-8的大部分内容都值得怀疑。
“UTF-8”中的“8”与位的代码单位的长度有关。代码单元是用于对字符进行编码的实体,不一定是简单的一对一映射。 UTF-8使用可变数量的代码单元来编码字符。
可以用UTF-8编码的字符集与UTF-16或UTF-32完全相同,即所有Unicode字符。它们都编码整个Unicode编码空间,甚至包括非字符和未分配的代码点。
答案 8 :(得分:1)
虽然我同意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),其他起始代码(和相关范围)无效。
答案 9 :(得分:1)
Unicode与UTF-8牢固地结合在一起。 Unicode特别支持2 ^ 21个代码点(2,097,152个字符),这与UTF-8支持的代码点数完全相同。两种系统都为代码点等保留了相同的“死区”空间和受限区域。...as of June 2018 the most recent version, Unicode 11.0, contains a repertoire of 137,439 characters
根据unicode标准。 Unicode FAQ
Unicode标准对U + 0000..U + 10FFFF范围内的字符进行编码, 总计21位代码空间。
来自UTF-8维基百科页面。 UTF-8 Description
由于Unicode代码空间限制为21位值 2003年,定义了UTF-8以将代码点编码为一到四个字节,...