2009-10-14 21 views
2

好的,Python的libxml2绑定文档确实是****。我的问题:Python的libxml2无法解析unicode字符串

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

+0

'u“...”'是一个** unicode字符串**,它的内部编码不是你所关心的,它不是UTF-8。 – u0b34a0f6ae

+0

也适用于urrllib2等 –

回答

6

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

你应该做的是通过str,不unicode到您的库:

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

(虽然有些技巧是可能的site.setencoding,如果你有兴趣阅读,或通过localeunicode字符串自动转换。 )

编辑:The Unicode article由Joel Spolsky的是很好的指导字符串中的字符与字节编码等

+0

感谢您的回答!好的,我想我必须再次考虑Python中的字符串(尽管如果libsml2会接受basestring实例,它会很好)。 – Boldewyn

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编码的二进制表示。

+0

感谢您的答案,它完美的作品。虽然安德烈是第一个。 – Boldewyn