Python xml 解析器如何检测编码(utf-8 与 utf-16)?

问题描述 投票:0回答:1

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

问题:

  • 让解析器检测正确的编码是否安全(utf-8 与 utf-16,如果解析器中未指定,其他编码会失败)?
  • 检测似乎是在expat C库中完成的。它如何可靠地检测正确的编码?
python xml character-encoding elementtree expat-parser
1个回答
0
投票

检测 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];
© www.soinside.com 2019 - 2024. All rights reserved.