Python XML 解析器可以解析各种编码的字节字符串(即使 XML 标头中没有指定编码):
from xml.etree import ElementTree as ET
xml_string = '<doc>Glück</doc>'
xml_utf_8 = xml_string.encode('utf-8')
xml_utf_16 = xml_string.encode('utf-16')
print(ET.fromstring(xml_utf_8).text)
print(ET.fromstring(xml_utf_16).text)
输出:
Glück
Glück
问题:
检测 Expat 中编码的代码目前位于文件 initScan
函数
xmltok.c
中,它正在检查各个字节,例如将它们与小端 UTF-16、大端 UTF-16 和 UTF8 中已知的字节顺序标记进行比较;空字节也发挥了作用。要找到代码对编码做出最终决定的位置,您可以在 Expat 的 Git 克隆上执行此操作:
# git --no-pager grep -F '= encodingTable[UTF'
lib/xmltok.c: *encPtr = encodingTable[UTF_16BE_ENC];
lib/xmltok.c: *encPtr = encodingTable[UTF_16LE_ENC];
lib/xmltok.c: *encPtr = encodingTable[UTF_16LE_ENC];
lib/xmltok.c: *encPtr = encodingTable[UTF_8_ENC];
lib/xmltok.c: *encPtr = encodingTable[UTF_16BE_ENC];
lib/xmltok.c: *encPtr = encodingTable[UTF_16LE_ENC];