我最近在角色编码方面经历了article。我对那里提到的某一点表示担忧。
在第一个图中,作者显示了各种字符集中的字符,它们的代码点以及它们如何以各种编码格式进行编码。
例如,é的代码点是E9
。
在ISO-8859-1
编码中,它表示为E9
。
在UTF-16
中,它表示为00 E9
。
但在UTF-8
中,它使用2个字节C3 A9
来表示。
我的问题是为什么需要这个?它可以用1个字节表示。为什么使用两个字节?你能告诉我吗?
答案 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