【发布时间】:2014-07-25 14:27:37
【问题描述】:
在 Python 2.7 中,当将 unicode 字符串传递给 XML 声明中包含 encoding="UTF-16" 的 ElementTree 的 fromstring() 方法时,我收到 ParseError 指出指定的编码不正确:
>>> from xml.etree import ElementTree
>>> data = u'<?xml version="1.0" encoding="utf-16"?><root/>'
>>> ElementTree.fromstring(data)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Program Files (x86)\Python 2.7\lib\xml\etree\ElementTree.py", line 1300, in XML
parser.feed(text)
File "C:\Program Files (x86)\Python 2.7\lib\xml\etree\ElementTree.py", line 1642, in feed
self._raiseerror(v)
File "C:\Program Files (x86)\Python 2.7\lib\xml\etree\ElementTree.py", line 1506, in _raiseerror
raise err
xml.etree.ElementTree.ParseError: encoding specified in XML declaration is incorrect: line 1, column 30
这是什么意思?是什么让 ElementTree 这么想?
毕竟,我传递的是 unicode 代码点,而不是字节字符串。这里不涉及编码。怎么可能不正确?
当然,有人可能会争辩说任何编码都不正确,因为这些 unicode 代码点没有被编码。但是,那为什么 UTF-8 不被拒绝为“错误编码”呢?
>>> ElementTree.fromstring(u'<?xml version="1.0" encoding="utf-8"?><root/>')
我可以通过将 unicode 字符串编码为 UTF-16 编码的字节字符串并将其传递给 fromstring() 或将 unicode 字符串中的 encoding="utf-16" 替换为 encoding="utf-8" 来轻松解决此问题,但我想了解为什么会引发该异常。 documentation of ElementTree 没有说明只接受字节字符串。
具体来说,我想避免这些额外的操作,因为我的输入数据可能会变得非常大,并且我想避免它们在内存中两次以及处理它们的 CPU 开销超过绝对必要。
【问题讨论】:
标签: python-2.7 unicode encoding elementtree python-unicode