2009-06-15 85 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。

要解決此問題,您需要直接散列unicode對象,或使用正確的編解碼器轉換字符串。

例如,如果你是從美國的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和Unicode有用的信息。特別參見「爲什麼不打印作品?」一節。

1

該錯誤似乎並不在__hash__函數中,而是在__str__函數中。

嘗試str(yourobject)與問題的對象,你會明白我的意思。

請編輯該問題並添加您的__str__函數(和相關數據),以便我們可以指導您如何糾正它。