3

OK、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 インスタンスになるため、私のセットアップでは機能しません。

UTF-8 でエンコードされた文字列を解析するために libxml2 をどのように使用できるか知っている人はいますか?

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 に答える