2011-07-13 16 views
22

Sau nhiều tìm kiếm tôi đã không thể xác định làm thế nào để tránh một lỗi nêu: "Unicode-đối tượng phải được mã hóa trước khi băm" khi sử dụng mã này:Cách sửa lỗi mã hóa Unicode bằng mô-đun hashlib?

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

Làm thế nào tôi có thể vượt qua lỗi đó? Làm thế nào để mã hóa các đối tượng Unicode?

Trả lời

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

Giả sử bạn đang sử dụng Python 3, điều này sẽ chuyển đổi các chuỗi Unicode được trả về bởi input() vào một đối tượng bytes UTF-8, hoặc bất cứ mã hóa bạn muốn sử dụng. Các phiên bản trước của Python cũng có nó, nhưng việc xử lý các chuỗi Unicode so với Unicode không có chút lộn xộn, trong khi Python 3 có sự phân biệt rõ ràng giữa các chuỗi Unicode (str) và các chuỗi không thay đổi của byte có thể hoặc không thể đại diện Ký tự ASCII (bytes).

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

+0

Cảm ơn bạn rất nhiều! Điều đó làm việc hoàn hảo! Tôi ước tôi đã nhận ra điều đó sớm hơn. Cảm ơn mặc dù. – Nate

+0

Bạn đang khá hoan nghênh. – JAB

+7

Trong khi tôi không có fan lớn về xử lý unicode của Python 2.x, mã đặc biệt này cũng hoạt động hoàn toàn tốt trong Python 2.7, vì cả hai kiểu 'str' và' unicode' đều có phương thức mã hóa, và được cung cấp một chuỗi chỉ bao gồm các ký tự ASCII, mã hóa utf-8 của chuỗi chính xác bằng chuỗi byte của các ký tự đó. Thực tế đó rất quan trọng nếu bạn muốn băm cho "abc" và u "abc" xuất hiện giống nhau. Nếu bạn đồng ý với hai điều đó được xử lý khác nhau, thì mọi mã hóa đều ổn. – GrandOpener