2012-07-01 15 views
14

私はHOWTO on Unicodeを公式の文書と完全で非常に詳細なarticleから読みました。まだ私はそれが私にこのエラーを投げる理由を得ることはありません。UnicodeEncodeError: 'ascii'コーデックは文字をエンコードできません[...]

私が試したのは以下のとおりです。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という変数に割り当て、それをクラスの変数に割り当てます。

for element in obj: 
    print element 

そして、このコマンドは、同様に動作します:

print obj.__repr__() 

を私はすべてのを得__iter__()を定義し

完全に今、何の作品は(objがクラスのインスタンスである)これらのコマンドです変数__repr__()は典型的なprintfを使用します:"%s" % self.varname

両方のコマンドが完全に印刷され、彼はユニコードのキャラクターです。 何を動作しませんが、このです:

print obj 

そして、これはだから私は何をしないのです恐ろしい

UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 47: 

をスローしますので、今、私はこだわっていますか?私は間違って何をしていますか?私は一般的な解決策を探しています。私はいつも可能なエラーを避け、互換性のあるプログラムを書くために、文字列をユニコードとして扱いたいと思っています。

編集:私はこの

+1

'print obj'は' __repr__'ではなく、オブジェクトの '__str__'を使用します。 – BrenBarn

+2

デフォルトのエンコーディングは何ですか?私は* sys.getdefaultencoding()* –

+0

@BrenBarn:__str__はreturn __repr __()として実装されています – javex

答えて

4

が、私は最終的にそれを解決することを得た文書から

def __str__(self): 
    return self.__repr__() 
def __unicode__(self): 
    return self.__repr__() 

:私もこれを定義しました。あなたが__str__()または__repr__()のいずれかを直接呼び出すと、それをうまく処理するためのhapypになりますが、それを直接印刷すると(print objのように)問題が起きることはありません(ただ__str__() )。

最終的なヘルプはarticleから来ました。私はすでにutf-8エンコーディングを使用していたときに、コンソールに印刷するために手に入れたステップに行きました(間違った文字)。最後に、それは、これを定義することにより、完全に正しいことが解か:

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

されたままにのみオープン質問:なぜこれとは異なるprint obj.__str__()print objを行うには?それは私には意味がありません。そして、はい、再びそれを強調する:前者または__repr__() DIDの仕事を呼び出す。それでも、明示的なエンコーディングを使用しています。

+0

ヘルプ記事は利用できなくなりました – Martlark

関連する問題