为什么ElementTree重新编码我的字符串?

时间:2013-08-17 12:39:58

标签: python xml encoding elementtree

请参阅:

>>> import xml.etree.ElementTree as et

>>> xmlstring = """<?xml version="1.0" encoding="UTF-8"?>
... <dm>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
...     &lt;string&gt;R\xc3\xa9sum\xc3\xa9&lt;/string&gt;
... </dm>
... """

XML源是UTF-8编码的(\xc3\xa9 =é):

>>> print xmlstring
<?xml version="1.0" encoding="UTF-8"?>
<dm>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
     &lt;string&gt;Résumé&lt;/string&gt;
</dm>

现在,让我们解析一下:

>>> dm = et.fromstring(xmlstring)
>>> dm.text
u'<?xml version="1.0" encoding="UTF-8"?>\n     <string>R\xe9sum\xe9</string>\n'

如您所见,\xc3\xa9(utf-8)字符已转换为\xe9(iso-8859-1)。

2 个答案:

答案 0 :(得分:3)

这是正常的Python行为;您正在查看 unicode 字符串表示,可以将其粘贴回Python解释器而不会出现编码问题,因为任何非ASCII或不可打印的字节都表示为转义码。请注意,换行符也由其\n转义码表示。

使用print dm.text写出没有Python字符串文字表示的字节值:

>>> text = u'<?xml version="1.0" encoding="UTF-8"?>\n     <string>R\xe9sum\xe9</string>\n'
>>> print text
<?xml version="1.0" encoding="UTF-8"?>
     <string>Résumé</string>

代码点是 unicode 代码点,但由于它们低于U + 0100,Python使用\x..转义代码表示它们。更高的代码点将使用\u....转义码。在Unicode标准中,U + 0100以下的代码点与Latin 1标准匹配。

如果您预期使用UTF-8字节,则再次将Unicode值编码为UTF-8:

>>> text.encode('utf8')
'<?xml version="1.0" encoding="UTF-8"?>\n     <string>R\xc3\xa9sum\xc3\xa9</string>\n'

答案 1 :(得分:-2)

如果你正在使用Python&lt;你有没有尝试过:# - - 编码:utf8 - - 否则Python将根据实现使用编码。