我正在尝试解析我公司内部创建的 XML 文件。该文件应该是 UTF-16 编码的,但我在编写 Python 脚本时遇到错误(见下文)。我想弄清楚问题出在文件还是我的脚本上。有没有办法验证编码?我的所有搜索都以 XML 验证工具或检查格式正确的 XML 的工具结束。我希望尝试使用 XMLSpy,但我目前无法访问它。
引发错误的代码是“parser.parse”行(Python 2.7):
from xml.sax import make_parser
from xml.sax.handler import ContentHandler
import codecs
parser = make_parser()
curHandler = XmlHandler()
parser.setContentHandler(curHandler)
parser.parse(codecs.open(infile, 'rb', fileEncoding))
其中“infile”是相关的 XML 文件,在此实例中“fileEncoding”是“UTF-16”。
该脚本适用于 UTF-8 编码文件。但是对于 UTF-16 文件,我收到以下错误:
xml.sax._exceptions.SAXParseException: XmlFile.xml:1:30: encoding specified in XML declaration is incorrect
很抱歉,我无法发布 XML。它并不复杂,但确实包含来自多个外国的单词/名称。我目前的怀疑是编码是 UTF-8,但编码属性被设置为 UTF-16。有没有办法验证这一点?
更新: 好的。所以现在我很困惑。我将 XML 文件的编码从 UTF-16 更改为 UTF-8,但忘记在脚本中进行更改。脚本按预期运行。所以文件 encoding='UTF-8' 但打开方式是:
parser.parse(codecs.open(infile, 'rb', 'UTF-16'))
按预期工作,没有错误。
更多信息:我正在 Win7/Server 2008 环境中开发/执行。
请您参考如下方法:
给自己一个 HEX 编辑器(或编写一个程序来转储输入文件的前八个字节)。
- 寻找 Byte order mark (BOM) 在一开始。如果它在那里,那就是你的编码。
- 否则你应该看到
0x3C(UTF-8),0x003C(UTF-16) 或者可能,但不太可能,0x0000003C(UTF-32)(XML 序言的开头<字符。
