Python的libxml2无法解析unicode字符串
好的,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文章是理解字符串字符和字节、编码等内容的好指南。