Python 2.7解析UTF-8编码XML时特殊字符显示问题求助
在Python 2.7中解析UTF-8多语言XML时保留特殊字符的解决方案
我太懂Python2.7里编码问题的糟心了!你遇到的特殊字符被转成奇怪实体/乱码的问题,核心是Python2.7区分bytes和unicode字符串,加上ElementTree默认的解析逻辑在处理UTF-8文件时容易踩坑。下面是具体的修复步骤和代码调整:
关键问题分析
你看到的Ettinger Straße“是因为XML里的UTF-8字符被错误地编码成了HTML实体,本质是解析时没有正确处理文件的UTF-8编码,导致ElementTree没有自动解码这些特殊字符,反而把它们当成了普通文本。
修复步骤与代码调整
1. 手动以UTF-8编码读取XML文件
Python2.7的et.parse()默认会用系统编码读取文件,这很容易导致UTF-8文件被读错。改成手动读取文件为unicode字符串,再用fromstring解析,能从根源避免编码偏差。
2. 用unicode字符串处理文本逻辑
Python2.7的string模块函数对unicode支持不好,改用字符串自身的方法;同时确保所有文本操作都基于unicode,避免bytes/unicode混编带来的隐性错误。
3. 正确处理输出编码
打印unicode字符串时,要先编码为UTF-8再输出,避免Python自动转成系统编码导致终端乱码。
修改后的完整代码:
import xml.etree.ElementTree as et import sys import codecs print("using texttool_navi.py" + sXmlFile) # 初始化变量(改用unicode类型避免编码问题) sAddress = u'' sAcronym = u'' sPlace = u'' sData = u'' # 手动读取UTF-8 XML文件为unicode with codecs.open(sXmlFile, 'r', 'utf-8') as f: xml_content = f.read() root = et.fromstring(xml_content) for child in root: if child.attrib["ID"] == sID: # tostring返回bytes,解码为unicode再打印 schild = et.tostring(child, encoding='utf-8') print('line ' + schild.decode('utf-8')) # child.text此时应该是unicode,直接使用 sData = child.text # 用unicode字符串的split方法 sData_list = sData.split(u'"') print(sData_list) sAddress = sData_list[1] sAcronym = sData_list[3] sPlace = sData_list[5] if sID == 'a specific ID': # 用unicode字符串的replace方法 sAddress = sAddress.replace(u'\\n', u' ') sAcronym = sAcronym.replace(u'\\n', u' ') sPlace = sPlace.replace(u'\\n', u' ') # 输出时编码为UTF-8再打印(避免终端乱码) print("Address: " + sAddress.encode('utf-8')) print("Acronym: " + sAcronym.encode('utf-8')) print("Place: " + sPlace.encode('utf-8'))
额外注意点
- 确保你的XML文件确实是UTF-8编码(无BOM最好),如果有BOM,读取时可以把编码改成
utf-8-sig - 所有字符串字面量前加
u(比如u'"'、u'\\n'),确保是unicode类型 - 尽量避免在Python2.7中混用bytes和unicode,所有文本处理都统一用unicode,最后输出时再编码为UTF-8
内容的提问来源于stack exchange,提问作者N.Las
相关产品推荐
相关产品推荐

