我有包含许多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没有变化的输入编码。 我能做些什么来解决非英语文本?
您所看到的结果是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机器,但没有你正在使用的文件的实际样品,也很难进一步分析。