Почему ElementTree отклоняет объявления XML UTF-16 с «неправильной кодировкой»?
В Python 2.7 при передаче строки Unicode в ElementTreefromstring()
метод, который имеетencoding="UTF-16"
в объявлении 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()
или заменивencoding="utf-16"
сencoding="utf-8"
в строке Unicode, но я хотел бы понять, почему возникает это исключение.документация ElementTree ничего не говорит только о принятии байтовых строк.
В частности, я хотел бы избежать этих дополнительных операций, потому что мои входные данные могут стать довольно большими, и я бы хотел, чтобы они не были дважды в памяти и нагрузка на процессор при их обработке более чем абсолютно необходима.