向后解码Unicode文本

时间:2016-04-12 19:28:15

标签: python text unicode encoding

许多文本编码都具有以下属性:您可以通过编码文本向后并仍然可以对其进行解码。 ASCII,UTF-8,UTF-16和UTF-32都具有此属性。这使您可以轻松地读取文件的最后一行,而无需读取前面的所有行,或者从文件的当前位置向后退几行。

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

我本可以自己实现与编解码器相关的字符边界同步,向后读取二进制块,并从codecs模块向适当的解码器提供正确对齐的块,但这听起来像是一种非-expert会遗漏一些微妙的细节而不会注意输出是错误的。

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

有些人似乎错过了读取整个文件来实现此目的的观点。虽然我在澄清一些事情,但我还是可以补充说,这也需要适用于可变长度编码必须支持UTF-8

1 个答案:

答案 0 :(得分: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 ""

结果:

$ 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