2011-07-13 25 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