关于UTF-8的一个好处是,解码器可以在字符串中的任何点处查看UTF-8字符串并开始解码。例如,如果我有字符串“héllo”:
68 c3 a9 6c 6c 6f
h. é.... l. l. o.
我可以将指针指向该字符串中的任何位置而没有其他信息,然后开始解码。如果我落在代码点的中间,我就不会得到那个代码点(除非我向后搜索),但是UTF-8的结构给了我足够的信息来知道我正处于代码点的中间,寻求转发到下一个,然后在那里工作。
所有编码都不是这样。例如,在Shift-JIS中,如果我按以下顺序随机删除指针:
… 83 84 83 84 83 84 83 …
如果我开始在83
上解码,我会:“ヤヤヤヤヤ......”
如果我开始在84
上解码,我得到:“ссссс......”(这是“CYRILLIC SMALL LETTER ES(U + 0441)”的序列,而不是ASCII“c”。)
如果我们假设我总是登陆角色边界,我可以解码而没有其他状态。 (如果我没有,我无法可靠地解码,正如我所示。)但如果我在角色边界,我不需要其他状态。
最后,人们可以使用以下规则构建编码(公认有些病态):
假设所有字节都是0x00 - 0x7f或0xff。 (即,永远不会出现[0x80,0xfe]字节)
对于任何非0xFF
字节,只需像ASCII那样解码该字节。如果遇到0xff
,则将后续字节编码为(U + 0080 +该字节)。在下一个0xff
,再次开始像ASCII一样解码。在这里,可以认为0xff
字节改变了“页面”。重要的是,如果我在此编码中将指针放在随机字符边界,我无法解码,因为我不知道是否发生了先前的0xff
字节。即字符串“!"#¡¢£!"#
”,是:
21 22 23 ff 21 22 23 ff 21 22 23
! " # ¡ ¢ £ ! " #
^shift up ^shift down
我很想知道:像上一个例子那样奇怪的编码确实存在吗? (如果是这样,哪个?)说不然,给定一个指针我知道指向任意编码字符串中代码点的开头,我可以从那个点可靠地解码而没有其他信息?