Python的libxml2无法解析Unicode字符串。

3

好的,Python的libxml2绑定文档真的很****。我的问题:

一个XML文档存储在Python的字符串变量中。该字符串是Unicode实例,并且其中有非ASCII字符。我想使用libxml2解析它,看起来像这样:

# -*- coding: utf-8 -*-
import libxml2

DOC = u"""<?xml version="1.0" encoding="UTF-8"?>
<data>
  <something>Bäääh!</something>
</data>
"""

xml_doc = libxml2.parseDoc(DOC)

得到这个结果:

Traceback (most recent call last):
  File "test.py", line 13, in <module>
    xml_doc = libxml2.parseDoc(DOC)
  File "c:\Python26\lib\site-packages\libxml2.py", line 1237, in parseDoc
    ret = libxml2mod.xmlParseDoc(cur)
UnicodeEncodeError: 'ascii' codec can't encode characters in position 46-48:
ordinal not in range(128)

重点是"..."的声明。如果我用简单的".."取代它,那么一切都好。不幸的是,在我的设置中这行不通,因为DOC肯定是Unicode实例。
有人知道如何让libxml2解析UTF-8编码的字符串吗?

u"..." 是一个 unicode 字符串,它的内部编码不是你所关心的,它不是 UTF-8。 - u0b34a0f6ae
同样适用于urllib2等。 - Nick Stinemates
2个回答

9

应该是这样的

# -*- coding: utf-8 -*-
import libxml2

DOC = u"""<?xml version="1.0" encoding="UTF-8"?>
<data>
  <something>Bäääh!</something>
</data>
""".encode("UTF-8")

xml_doc = libxml2.parseDoc(DOC)

使用.encode("UTF-8")是为了获取unicode字符串的二进制表示,并使用utf8编码。


谢谢你的回答,它完美地运行了。不过安德烈先回答了。 - Boldewyn

6

尽管看起来像文本,但XML是一种二进制格式。在XML文件开头指定编码以将XML字节解码为文本。

您应该将str而非unicode传递给您的库:

xml_doc = libxml2.parseDoc(DOC.encode("UTF-8"))

尽管在涉及自动转换通过locale来读写unicode字符串时,可以使用site.setencoding的一些技巧。

编辑:Joel Spolsky的Unicode文章是关于字符串字符与字节、编码等方面的良好指南。


谢谢你的回答!好的,我想我必须重新考虑Python中的字符串(尽管如果libxml2可以接受basestring实例会很好)。 - Boldewyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接