在Python 2.7中,当将编码为"UTF-16"的unicode字符串传递给ElementTree的
具体而言,由于我的输入数据可能非常大,我想避免这些额外的操作,并尽可能地避免在内存中将它们重复处理并增加CPU开销。
fromstring()
方法时,如果XML声明中指定的编码不正确,则会收到一个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"
。但我希望了解为什么会引发那个异常。ElementTree文档没有提到只接受字节字符串的事情。具体而言,由于我的输入数据可能非常大,我想避免这些额外的操作,并尽可能地避免在内存中将它们重复处理并增加CPU开销。