我最近一直阅读了对UTF-8可变宽度编码,并且我觉得很奇怪,UTF-8指定每延续字节的前两个比特是10,为什么需要在UTF-8中标记连续字节?
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'字节,则无法判断这是一个完整的字符还是多字节序列的损坏结尾。 (假设我不能后退。) –