如何使用hashlib模块修复Unicode编码错误?

29

在多次搜索后,我仍无法确定如何避免使用此代码时出现错误:"Unicode-objects must be encoded before hashing"。

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

我该如何避免那个错误?你如何对Unicode对象进行编码?

1个回答

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

如果您使用的是 Python 3,则可以将 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


8
虽然我不太喜欢 Python 2.x 的 Unicode 处理方式,但这段代码在 Python 2.7 中应该也可以完美运行,因为 strunicode 类型都有 encode 方法,并且只要一个字符串只包含 ASCII 字符,那么该字符串的 utf-8 编码就等于这些字符的字节串。如果你想让 "abc" 和 u"abc" 的哈希值相同,则这个事实非常重要。如果你不介意将它们视为不同的内容,则任何编码方式都可以。 - GrandOpener

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接