Python的libxml2无法解析unicode字符串

Bol*_*wyn 2 python xml unicode libxml2

好的,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)
Run Code Online (Sandbox Code Playgroud)

结果如下:

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)
Run Code Online (Sandbox Code Playgroud)

关键是u"..."宣言.如果我用简单的替换它"..",那么一切都很好.不幸的是它在我的设置中不起作用,因为它DOC肯定是一个Unicode实例.

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

Pet*_*ann 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)
Run Code Online (Sandbox Code Playgroud)

需要.encode("UTF-8")来获取具有utf8编码的unicode字符串的二进制表示.


And*_*ikh 6

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

你应该做的是通过str,而不是unicode你的图书馆:

xml_doc = libxml2.parseDoc(DOC.encode("UTF-8"))
Run Code Online (Sandbox Code Playgroud)

(site.setencoding如果您有兴趣unicode通过自动转换来阅读或编写字符串,可以使用一些技巧locale.)

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