python - 读取包含 UTF-8 xml 文件的 zip 时出现问题

标签 python utf-8 zip

我有包含许多 UTF-8 xml 文件的 zip 存档。这些文件主要包含英文标签和文本,但少数标签包含非英文文本。打开 zip 文件并解析其中的 xml 文件没有问题,但非英语文本会丢失其编码。

当在 Notepad++ 中提取并打开 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,没有任何变化。我该怎么做才能修复非英文文本?

最佳答案

您看到的结果是 UTF-8 被错误地解码为 latin-1/iso-8859-1:

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

我将以下通过 Notepad++ 编码的文本保存为一个编码为 UTF-8 且没有 BOM 的单个文件,并保存在一个 zip 文件中:

<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 机器上显示不正确,但没有您正在使用的文件的实际样本,很难进一步分析。

关于python - 读取包含 UTF-8 xml 文件的 zip 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10629273/

相关文章:

zip - 如何使用ANT压缩两个文件夹?

azure - 在 Azure 中使用 Kudu 控制台上传 .zip 文件/解压缩时出错

java - 如何查找 Zip 文件目录中的任何文件

python - 数据框和子图中的日期错误

python - 从函数返回子图

python - 将多行粘贴到 IDLE

php - 如何将 Unicode 转义序列(如 "\u00ed")解码为正确的 UTF-8 编码字符?

ruby-on-rails - Ruby on Rails 中带有 × 字符的 UTF-8 问题

python - Flask:忽略 'category' 参数的 Flash 函数

php - 在mysql中使用UTF-8的终极方法