15

公式ドキュメントの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__()

ドキュメントから、私はこれを得ました

4

1 に答える 1

5

やっと解決しました。問題は(理由はわかりませんが)、どちらか__str__()または__repr__()直接呼び出した場合、それをうまく処理するのは幸せですが、直接(:のようにprint obj)印刷しても機能しません(ただし、それ__str__()自体を呼び出すだけです)。

最後の助けはこの記事から来ました。utf-8エンコーディングを使用したときに、コンソールに印刷する手順にすでに到達しました(ただし、文字が間違っています)。最後に、これを定義することにより、完全に正しいように解決しました。

def __str__(self):
    return self.__repr__().encode(stdout.encoding)

print obj.__str__()現在残っている唯一の未解決の質問は次のとおりprint objです。それは私には意味がありません。そして、はい、それをもう一度強調します。前者または__repr__()DIDを呼び出すことは機能します。そして、それでも明示的なエンコーディングを行います。

于 2012-07-03T19:16:19.207 に答える