向后解码Unicode文本

use*_*ica 7 python unicode encoding text

许多文本编码都具有以下属性:您可以向后查看编码文本,但仍然可以对其进行解码.ASCII,UTF-8,UTF-16和UTF-32都具有此属性.这可以让你做一些方便的事情,比如读取文件的最后一行而不读取它前面的所有行,或者从文件中的当前位置向后移几行.

不幸的是,Python似乎没有任何方法可以向后解码文件.您不能read向后或seek按编码文件中的字符数量.codecs模块中的解码器支持向前递增解码,但不支持向后解码.似乎没有任何"UTF-8-backwardwards"编解码器,我可以以相反的顺序提供UTF-8字节.

我本可以自己实现与编解码器相关的字符边界同步,向后读取二进制块,并将正确对齐的块提供给codecs模块中的适当解码器,但这听起来像非专家会错过一些细微的细节和没有注意到输出是错误的.

有没有简单的方法可以使用现有工具在Python中向后解码文本?


有几个人似乎错过了阅读整个文件来做到这一点的观点.虽然我在澄清事情,但我还是补充一点,这也需要适用于可变长度编码.UTF-8支持是必须的.

Rob*_*obᵩ 5

缺少通用解决方案,这是utf-8特有的解决方案:

def rdecode(it):
    buffer = []
    for ch in it:
        och = ord(ch)
        if not (och & 0x80):
            yield ch.decode('utf-8')
        elif not (och & 0x40):
            buffer.append(ch)
        else:
            buffer.append(ch)
            yield ''.join(reversed(buffer)).decode('utf-8')
            buffer = []

utf8 = 'ho math\xc4\x93t\xc4\x93s hon \xc4\x93gap\xc4\x81 ho I\xc4\x93sous'
print utf8.decode('utf8')
for i in rdecode(reversed(utf8)):
    print i,
print ""
Run Code Online (Sandbox Code Playgroud)

结果:

$ python x.py 
ho math?t?s hon ?gap? ho I?sous
s u o s ? I   o h   ? p a g ?   n o h   s ? t ? h t a m   o h 
Run Code Online (Sandbox Code Playgroud)