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

App*_*pps 5 utf-8 character-encoding

我最近浏览了一篇关于字符编码的文章.我对那里提到的某一点表示担忧.

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

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

Stu*_*ook 12

单个字节只能容纳256个不同值中的一个.

这意味着将每个字符表示为单个字节的编码(例如ISO-8859-1)不能编码超过256个不同的字符.这就是您无法使用ISO-8859-1正确编写阿拉伯语,日语或许多其他语言的原因.可用空间有限,并且已被其他角色使用.

另一方面,UTF-8需要能够表示Unicode中的所有数百万个字符.这使得无法将每个字符压缩成单个字节.

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

如果您想要直观地解释为什么上面的字节7F不代表相应的8859-1字符,请查看Wikipedia上的UTF-8编码单元表.您将看到ASCII范围之外的每个字节值已经具有含义,或者由于历史原因而非法.表中没有空间来表示它们的8859-1等效字节,并且给出字节附加含义会破坏UTF-8的几个重要属性.

  • UTF-8已经使用以"E"开头的字节来表示三字节序列的开始.例如,代码点U + 9A69(欢)被编码为"E9 A9 A9".如果`E9`用于表示U + 00E9,这将不起作用,您将不得不以不同的方式完全重新设计编码. (5认同)

Boh*_*ian 9

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

  • <pendantic>对于\ x80下的代码点,最后_seven_位保存字符数据.对于连续字节,使用6位.对于多字节编码的前导字节,使用5或4位.</ pendantic> (6认同)
  • utf-8 的天才之处在于,通过检查两个高位,您可以确定您是在字符的开头还是中间。这是一个困扰早期“宽”字符集尝试的问题;当您将字符串子串到字符串的中间时,您不知道字节是字符的开头还是中间,或者,“移位到宽”/“移位到 8 位”编码的位置是最后一个移位字符。 (2认同)