我最近在研究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中的连续位真的那么重要吗?第二种编码方式更加高效。
0xxxxxx
字节,我无法确定它是一个完整的字符还是多字节序列的损坏结尾。(假设我不能往回走。) - Kerrek SB