为什么UTF-8使用多个字节来表示某些字符?

为什么UTF-8使用多个字节来表示某些字符?,utf-8,character-encoding,Utf 8,Character Encoding,我最近做了一个关于字符编码的实验。我对上面提到的某一点有点担心 在第一幅图中,作者展示了字符、它们在各种字符集中的代码点以及它们是如何以各种编码格式编码的。 例如,é的代码点是E9。 在ISO-8859-1编码中,它表示为E9。 在UTF-16中,它表示为00e9。 但在UTF-8中,它使用2个字节表示,c3a9 我的问题是,为什么需要这样做?它可以用1个字节表示。为什么使用两个字节?您能告诉我吗?使用2个高位(位6和位7)来指示是否还有字节:只有低位6用于实际字符数据。这意味着7F上的任何字符

我最近做了一个关于字符编码的实验。我对上面提到的某一点有点担心

在第一幅图中,作者展示了字符、它们在各种字符集中的代码点以及它们是如何以各种编码格式编码的。 例如,é的代码点是
E9
。 在
ISO-8859-1
编码中,它表示为
E9
。 在
UTF-16
中,它表示为
00e9
。 但在
UTF-8
中,它使用2个字节表示,
c3a9


我的问题是,为什么需要这样做?它可以用1个字节表示。为什么使用两个字节?您能告诉我吗?

使用2个高位(位6和位7)来指示是否还有字节:只有低位6用于实际字符数据。这意味着
7F
上的任何字符都需要(至少)2个字节。

因为许多语言​​它采用2位编码,这根本不足以对所有字母表中的所有字母进行编码 看 2位编码00。。FF 15^2=255个字符
4位0000。。。FFFF 4^15=50625

单个字节只能保存256个不同值中的一个

这意味着将每个字符表示为单个字节的编码(如ISO-8859-1)不能编码超过256个不同的字符。这就是为什么不能使用ISO-8859-1正确书写阿拉伯语、日语或许多其他语言。可用空间有限,并且已被其他字符占用

另一方面,UTF-8需要能够以Unicode表示数百万个字符。这使得不可能将每个字符压缩成单个字节

UTF-8的设计者选择将所有ASCII字符(U+0000到U+007F)用一个字节表示,并要求将所有其他字符存储为两个或更多字节。如果他们选择给更多的字符一个单字节表示,其他字符的编码就会更长、更复杂


如果您想直观地解释为什么
7F
上面的字节不代表相应的8859-1字符,请查看。您将看到ASCII范围之外的每个字节值要么已经有了意义,要么由于历史原因是非法的。表中没有空间容纳字节来表示其8859-1等价物,赋予字节额外的含义将破坏UTF-8的几个重要属性。

对于\x80下的代码点,最后七位保存字符数据。对于连续字节,使用6位。对于多字节编码的前导字节,使用5或4位。谢谢Bohemian。这确实澄清了我的疑问。utf-8的天才在于,通过检查两个高位,你可以确定你是在字符的开头还是中间。这是一个困扰早期尝试“宽”字符集的问题;当您将子字符串添加到字符串的中间时,您不知道字节是字符的开头还是中间,或者“shift-to-wide”/“shift-to-8-bit”编码的位置最后一个移位字符是什么。这是一个漂亮、清晰、定量的答案。一个字节不能表示一百万个字符。我知道只有2^8个值可以用8位表示。我的问题是关于代码点“E9”的编码。为了表示这一点,8位就足够了。在UTF-16中是00E9。其中,如UTF-8所示,为C3A9。为什么不能使用E9呢?UTF-8已经使用以
E
开头的字节来表示三字节序列的开始。例如,代码点U+9A69(驩) 编码为
E9 A9 A9
。如果使用
E9
表示U+00E9,则这将不起作用,您必须以不同的方式完全重新设计编码。