2011-07-13 12 views
22

Después de varias búsquedas que no he sido capaz de determinar la forma de evitar un error que indica: "Unicode-objetos deben ser codificados antes de hash" cuando se utiliza este código:Cómo corregir un error de codificación Unicode usando el módulo hashlib?

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

¿Cómo puedo conseguir más allá de ese error? ¿Cómo se codifican los objetos Unicode?

Respuesta

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

Suponiendo que estés usando Python 3, esto va a convertir la cadena Unicode devuelto por input() en un objeto bytes codificado en UTF-8, o lo que sea la codificación que desea utilizar. Las versiones anteriores de Python lo tienen también, pero su manejo de cadenas Unicode vs. no Unicode era un poco desordenado, mientras que Python 3 tiene una distinción explícita entre cadenas Unicode (str) y secuencias inmutables de bytes que pueden o no representar Caracteres ASCII (bytes).

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

+0

Muchas gracias! Eso funcionó perfectamente! Ojalá me hubiera dado cuenta de eso antes. Gracias sin embargo. – Nate

+0

Eres bienvenido. – JAB

+7

Aunque no soy un gran admirador del manejo unicode de Python 2.x, este código en particular también debería funcionar perfectamente en Python 2.7, porque tanto el tipo 'str' como el' unicode' tienen el método de codificación, y, siempre que se trate de una cadena consiste solo en caracteres ASCII, la codificación utf-8 de la cadena es exactamente igual a la cadena de bytes de esos caracteres. Este hecho es importante si quiere que el hash para "abc" y "abc" salga igual. Si estás de acuerdo con que los dos reciban un trato diferente, entonces cualquier codificación está bien. – GrandOpener

Cuestiones relacionadas