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