2009-06-15 8 views
0

は、私は以下のハッシュ関数があります。ハッシュ法とPython 2.5ではUnicodeEncodeErrorを

def __hash__(self): 
    return hash(str(self)) 

それは私のニーズに適していますが、今私は、次のエラーメッセージを取得するために始めました。何が起こっているの任意のアイデア?

return hash(str(self)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 16: ordinal not in range(128) 

どうすればこの問題を解決できますか?

ありがとうございます!

答えて

2

問題は、ASCIIに変換できない文字列をハッシュしようとしていることです。 strメソッドはUnicodeオブジェクトを取り、デフォルトではASCIIに変換します。

この問題を解決するには、ユニコードオブジェクトを直接ハッシュするか、正しいコーデックを使用して文字列を変換する必要があります。あなたは、米国のWindowsローカライズされたシステム上のコンソールからUnicodeを読んでいる場合

たとえば、あなたがこれを行う可能性があります。一方

return hash(mystring.encode("cp437")) 

、レジストリやAPI関数からのデータは次のようにコード化されることがあります。

return hash(mystring.encode("cp1252")) 

ローカルシステムのエンコーディングがローカライズ等により異なりますので、あなたはそれがロケールライブラリを使用しているものを見つける必要がありますのでご注意ください。

str(self)を変換していることに気付きました。つまり、__str__メソッドをオーバーライドしてそのエンコードを行う必要があり、影響を受けるオブジェクトの場合はおそらく__repr__です。

http://boodebr.org/main/python/all-about-python-and-unicode

Pythonとユニコードに関する有用な情報をたくさん持っている素敵なリンクです。特に「印刷しない理由は何ですか?」のセクションを参照してください。

1

エラーは__hash__の機能ではなく、__str__の機能のようです。

問題のあるオブジェクトでstr(yourobject)を試してみると、私の言いたいことが分かります。

質問を編集して__str__機能(および関連するデータ)を追加して、修正方法を教えてください。

関連する問題