我最近在字符编码上经历了一个article。我对那里提到的某个观点感到担忧。为什么UTF-8使用多个字节来表示某些字符?
在第一个图中,作者显示了各种字符集中的字符,它们的代码点以及它们如何以各种编码格式进行编码。 例如,代码点é是E9
。 在ISO-8859-1
编码它被表示为E9
。 在UTF-16
中表示为00 E9
。 但是在UTF-8
中,它用2个字节表示,C3 A9
。
我的问题是为什么这是必需的?它可以用1个字节表示。为什么使用两个字节?你能让我知道吗?
我最近在字符编码上经历了一个article。我对那里提到的某个观点感到担忧。为什么UTF-8使用多个字节来表示某些字符?
在第一个图中,作者显示了各种字符集中的字符,它们的代码点以及它们如何以各种编码格式进行编码。 例如,代码点é是E9
。 在ISO-8859-1
编码它被表示为E9
。 在UTF-16
中表示为00 E9
。 但是在UTF-8
中,它用2个字节表示,C3 A9
。
我的问题是为什么这是必需的?它可以用1个字节表示。为什么使用两个字节?你能让我知道吗?
UTF-8使用高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字符,请查看UTF-8 coding unit table on Wikipedia。您将会看到,ASCII范围之外的每个字节值已经具有含义,或者由于历史原因是非法的。在表中没有用字节表示它们的8859-1等价物的空间,并且赋予这些字节额外的含义会破坏UTF-8的几个重要属性。
好,清晰,量化的答案。您不能在一个字节中表示一百万个字符。 –
我明白只有2^8个值可以用8位表示。我的问题是关于Code Point“E9”的编码。代表这8位就足够了。在UTF-16中是00E9。在UTF-8中,它是C3A9。为什么他们不能只使用E9? – Apps
UTF-8已经使用以'E'开始的字节来表示三字节序列的开始。例如,代码点U + 9A69(欢)被编码为“E9 A9 A9”。如果使用'E9'来表示U + 00E9,这将不起作用,您将不得不以不同的方式完全重新设计编码。 –
谢谢波西米亚。这确实说明了我的问题。 – Apps
utf-8的天才之处在于通过检查两个高位可以确定您是否处于角色的开始或中间位置。这是一个困扰较早尝试“宽”字符集的问题;当你将字符串串到字符串的中间时,你不知道字节是字符的开始还是中间,或者在“转换为宽”/“转换为8位”编码的位置,最后一个转换字符是什么。 –