2011-07-13 50 views
22

多次搜索之後,我一直無法確定如何避免錯誤,指出:「Unicode的對象散列之前必須被編碼」使用此代碼時:如何使用hashlib模塊修復Unicode編碼錯誤?

pwdinput = input("Now enter a password:") 
    pwd = hashlib.sha1() 
    pwd.update(pwdinput) 
    pwd = pwd.hexdigest() 

我怎樣才能得到過去的錯誤?你如何編碼Unicode對象?你使用Python 3

回答

41
pwdinput = input("Now enter a password:").encode('utf-8') # or whatever encoding you wish to use 

假設,這將由input()返回的Unicode字符串轉換成UTF-8編碼的bytes對象,或任何編碼,你想使用。以前的Python版本也有,但是它們對Unicode和非Unicode字符串的處理有點麻煩,而Python 3在Unicode字符串(str)和不可變字節的可變或不可替代字符之間有明確的區別ASCII字符(bytes)。

http://docs.python.org/library/stdtypes.html#str.encode
http://docs.python.org/py3k/library/stdtypes.html#str.encode

+0

太謝謝你了!這工作完美!我希望我早日意識到這一點。不過謝謝。 – Nate

+0

你很受歡迎。 – JAB

+7

雖然我並不是Python 2.x的unicode處理的忠實粉絲,但是這個特殊的代碼在Python 2.7中也應該可以很好地工作,因爲'str'和'unicode'類型都有編碼方法,並且提供了一個字符串只包含ASCII字符,字符串的utf-8編碼完全等於這些字符的字節串。 這個事實很重要,如果你想讓「abc」和u「abc」的哈希值相同。如果你對這兩種方式的處理方式不同,那麼任何編碼都可以。 – GrandOpener