【问题标题】:Decoding Unicode text backwards向后解码 Unicode 文本
【发布时间】:2016-04-12 19:28:14
【问题描述】:

许多文本编码具有您可以向后遍历编码文本并且仍然能够对其进行解码的属性。 ASCII、UTF-8、UTF-16 和 UTF-32 都具有此属性。这使您可以做一些方便的事情,例如读取文件的最后一行而不读取它之前的所有行,或者从文件中的当前位置向后退几行。

不幸的是,Python 似乎没有提供任何向后解码文件的方法。您不能在编码文件中按字符数量向后readseekcodecs 模块中的解码器支持增量解码向前,但不支持向后解码。似乎没有任何“UTF-8-backwards”编解码器可以以相反的顺序输入 UTF-8 字节。

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

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


有些人似乎错过了读取整个文件以达到目的这一点。在我澄清事情的同时,我不妨补充一点,这也需要适用于可变长度编码UTF-8 支持是必须的

【问题讨论】:

  • @gravity:读取整个文件。我特别想不这样做。
  • 那里有一个特定的社区 wiki 答案,其中涉及分块阅读。请在此直接链接中查看:stackoverflow.com/questions/260273/…
  • @gravity:这不适用于 Unicode。
  • 附言。 UTF-8 边界测试很简单。块的第一个字节不能满足(x & 0xc0) == 0x80

标签: python text unicode encoding


【解决方案1】:

没有通用解决方案,这里是 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 

【讨论】:

  • 这看起来像我对“自己实现”案例的想法,尽管它没有任何你想要在真实文件上操作的分块优化。我想很多我不想处理的工作实际上是在多编解码器支持和编写一个方便、高效的文件对象,支持read-ing 向前和向后和向后迭代;对于 UTF-8,解码本身还不错。
猜你喜欢
  • 2021-12-13
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多