Python的libxml2无法解析unicode字符串

3 投票
2 回答
5074 浏览
提问于 2025-04-15 15:04

好的,Python的libxml2库的文档真的是不太好用。我的问题是:

我在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编码的字符串呢?

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编码。

6

虽然XML看起来像是文本,但其实它是一种二进制格式。在XML文件的开头会指定一种编码,这样才能把XML的字节解码成文本。

你需要做的是把str传给你的库,而不是unicode

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

(不过,如果你想通过locale自动转换来读写unicode字符串,可以用一些小技巧,比如site.setencoding。)

补充:Joel Spolsky写的Unicode文章是理解字符串字符和字节、编码等内容的好指南。

撰写回答