0

看:

>>> 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)。

4

2 回答 2

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 的代码点与拉丁 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'
于 2013-08-17T12:45:40.513 回答
-2

如果您使用的是 Python < 3,您是否尝试过:# - - coding: utf8 - - 否则 Python 将根据实现使用编码。

于 2013-08-17T12:46:25.843 回答