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

时间:2011-08-21 04:44:02

标签: utf-8 character-encoding

我最近在角色编码方面经历了article。我对那里提到的某一点表示担忧。

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

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

3 个答案:

答案 0 :(得分:12)

单个字节只能容纳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的几个重要属性。

答案 1 :(得分:8)

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

答案 2 :(得分:-4)

因为许多语言它的2位编码根本不足以编码所有字母的所有字母 看  2位编码00 .. FF 15 ^ 2 = 255个字符  4位0000 ... FFFF 4 ^ 15 = 50625