【发布时间】:2016-12-20 00:12:00
【问题描述】:
我最近一直在阅读 UTF-8 可变宽度编码,我发现奇怪的是 UTF-8 将每个连续字节的前两位指定为 10。
Range | Encoding
-----------------+-----------------
0 - 7f | 0xxxxxx
80 - 7ff | 110xxxx 10xxxxxx
800 - ffff | 1110xxx 10xxxxxx 10xxxxxx
10000 - 10ffff | 11110xx 10xxxxxx 10xxxxxx 10xxxxxx
我在尝试其他可能的可变宽度编码,发现通过使用以下方案,最多需要 3 个字节来存储所有 Unicode。如果第一位为 1,则字符至少再编码一个字节(读取直到第一位为 0)。
Range | Encoding
-----------------+-----------------
0 - 7f | 0xxxxxx
80 - 407f | 1xxxxxx 0xxxxxxx
4080 - 20407f | 1xxxxxx 1xxxxxxx 0xxxxxxx
UTF-8 中的连续位真的那么重要吗?第二种编码似乎更有效。
【问题讨论】:
-
UTF-8 方案允许您从 任何 代码单元位置恢复预期的解码。
-
即使使用我的编码,这也是可能的。从任意位置向后退一步,直到找到一个结束字节(带 0),然后下一个字节是字符的开头。
-
并非如此:如果您指向
0xxxxxx字节,我无法判断这是一个完整的字符还是多字节序列的损坏结尾。 (假设我不能倒退。)
标签: unicode utf-8 character-encoding utf