公式ドキュメントのUnicode に関する HOWTOと、非常に詳細な完全な記事も読みました。それでも、なぜこのエラーがスローされるのかわかりません。
これが私が試みることです:ASCII範囲外の文字を含むXMLファイルを開きます(ただし、許可されたXML範囲内)。私はそれでcfg = codecs.open(filename, encoding='utf-8, mode='r')
うまくいきます。文字列を見るとrepr()
、ユニコード文字列も表示されます。
次に、 でそれを読みますparseString(cfg.read().encode('utf-8')
。もちろん、私の XML ファイルは次のように始まります: <?xml version="1.0" encoding="utf-8"?>
. 関係ないと思いますが、Python スクリプトに utf-8 も定義しましたが、Unicode 文字を直接記述していないため、ここでは当てはまりません。次の行も同じです。from __future__ import unicode_literals
これも冒頭にあります。
次に、生成されたオブジェクトを自分のクラスに渡します。そこで、次のようにタグを変数に読み込みxmldata.getElementsByTagName(tagName)[0].firstChild.data
、それを自分のクラスの変数に割り当てます。
今、完全に機能するのはこれらのコマンドです (obj はクラスのインスタンスです):
for element in obj:
print element
また、次のコマンドも同様に機能します。
print obj.__repr__()
典型的なprintfのものを使用し__iter__()
ながら、すべての変数を生成するように定義しました:__repr__()
"%s" % self.varname
どちらのコマンドも完全に印刷され、Unicode 文字を出力できます。うまくいかないのはこれです:
print obj
そして今、これは恐ろしいものを投げるので、私は立ち往生しています
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47:
それで、私は何が欠けていますか?私は何を間違っていますか?私は一般的な解決策を探しています。エラーを回避し、互換性のあるプログラムを作成するために、常に文字列をユニコードとして処理したいと考えています。
編集:これも定義しました:
def __str__(self):
return self.__repr__()
def __unicode__(self):
return self.__repr__()
ドキュメントから、私はこれを得ました