是否存在具有字符间状态的字符编码?

时间:2014-10-16 07:39:05

标签: character-encoding

UTF-8示例

关于UTF-8的一个好处是,解码器可以在字符串中的任何点处查看UTF-8字符串并开始解码。例如,如果我有字符串“héllo”:

68 c3 a9 6c 6c 6f
h. é.... l. l. o.

我可以将指针指向该字符串中的任何位置而没有其他信息,然后开始解码。如果我落在代码点的中间,我就不会得到那个代码点(除非我向后搜索),但是UTF-8的结构给了我足够的信息来知道我正处于代码点的中间,寻求转发到下一个,然后在那里工作。

Shift-JIS示例

所有编码都不是这样。例如,在Shift-JIS中,如果我按以下顺序随机删除指针:

… 83 84 83 84 83 84 83 …

如果我开始在83上解码,我会:“ヤヤヤヤヤ......”

如果我开始在84上解码,我得到:“ссссс......”(这是“CYRI​​LLIC 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

问题

我很想知道:像上一个例子那样奇怪的编码确实存在吗? (如果是这样,哪个?)说不然,给定一个指针我知道指向任意编码字符串中代码点的开头,我可以从那个点可靠地解码而没有其他信息?

0 个答案:

没有答案