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)

重点是u"..."声明。如果我用一个简单的替换它"..",那么一切都好。不幸的是,它在我的设置中不起作用,因为它DOC肯定是一个 Unicode 实例。

有谁知道如何使用 libxml2 来解析 UTF-8 编码的字符串?

4

2 回答 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") 来获取具有 utf8 编码的 unicode 字符串的二进制表示。

于 2009-10-14T21:35:10.533 回答
6

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

你应该做的是传递str,而不是unicode你的图书馆:

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

(尽管如果您对通过自动转换site.setencoding读取或写入字符串感兴趣,则可以使用一些技巧。)unicodelocale

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

于 2009-10-14T21:34:46.367 回答