问题读取包含UTF-8的xml文件的zip(Issues reading zip containin

2019-10-16 17:49发布

我有包含许多UTF-8的XML文件的ZIP档案。 这些文件大多是英文的标签和文本,但一些标签包含非英语文本。 我有打开zip文件,并解析XML文件,这里面没有问题,但非英语文本失去它的编码。

当被提取出来并在记事本中打开一个XML文件++中的非英语文本看起来像:

Курс карбованца к доллару не изменился на Украинской Межбанковской Валютной Бирже (УМВБ) - 176.100.

当它被提取并在Python读取(在Linux中)的文字是这样的:

ÐÑÑÑ ÐºÐ°ÑбованÑа к доллаÑÑ Ð½Ðµ изменилÑÑ Ð½Ð° УкÑаинÑкой ÐежбанковÑкой ÐалÑÑной ÐиÑже (УÐÐÐ) - 176.100.

我的代码如下所示:

def parse(self, fp):
    # open/decompress zip file
    with zipfile.ZipFile(fp, 'r') as f:
        # get all files in zip
        comp_files = f.namelist()
        for comp_file in comp_files:
            cfp = f.open(comp_file, 'r')
            # parse xml
            tree = ElementTree.parse(cfp)
            ...parsing...

我试图解码/编码来自CFP文本,并用包裹codecs.EncodedFile它()和UTF_8和utf_8_sig没有变化的输入编码。 我能做些什么来解决非英语文本?

Answer 1:

您所看到的结果是UTF-8正确解码拉丁-1 / ISO-8859-1:

>>> x=u'Курс карбованца к доллару не изменился на Украинской Межбанковской Валютной Бирже (УМВБ) - 176.100.'
>>> print x.encode('utf8').decode('latin1')
ÐÑÑÑ ÐºÐ°ÑбованÑа к доллаÑÑ Ð½Ðµ изменилÑÑ Ð½Ð° УкÑаинÑкой ÐежбанковÑкой ÐалÑÑной ÐиÑже (УÐÐÐ) - 176.100.

我保存经由记事本++编码以下文本作为如在压缩文件编码为UTF-8无BOM单个文件:

<text>Курс карбованца к доллару не изменился на Украинской Межбанковской Валютной Бирже (УМВБ) - 176.100.</text>

您与修改代码,使其可运行:

from xml.etree import ElementTree
import zipfile

def parse(fp):
    # open/decompress zip file
    with zipfile.ZipFile(fp, 'r') as f:
        # get all files in zip
        comp_files = f.namelist()
        for comp_file in comp_files:
            cfp = f.open(comp_file, 'r')
            # parse xml
            tree = ElementTree.parse(cfp)
            print tree.getroot().text
            print type(tree.getroot().text)

parse(open('file.zip'))

结果:

Курс карбованца к доллару не изменился на Украинской Межбанковской Валютной Бирже (УМВБ) - 176.100.
<type 'unicode'>

所以,在我看来它只是被不正确地显示在你的Linux机器,但没有你正在使用的文件的实际样品,也很难进一步分析。



文章来源: Issues reading zip containing UTF-8 xml files
标签: python utf-8 zip