2011-06-06 20 views
12
import hashlib 
string1 = u'test' 
hashstring = hashlib.md5() 
hashstring.update(string1) 
string2 = hashstring.digest() 

unicode(string2) 

UnicodeDecodeError: 'ascii' codec can't decode byte 0x8f in position 1: ordinal 
not in range(128) 

La cadena TIENE que ser unicode para que sea de alguna utilidad para mí, ¿se puede hacer esto? Usando Python 2.7 si eso ayuda ...Convierte hash.digest() en unicode

Respuesta

11

El resultado de .digest() es una cadena de bytes¹, por lo que convertirlo a Unicode no tiene sentido. Use .hexdigest() si desea una representación legible.

¹ Algunas cadenas de bytes se pueden convertir a Unicode, pero las cadenas de bytes devueltas por .digest() no contienen datos textuales. Pueden contener cualquier byte incluido el byte nulo: generalmente no se pueden imprimir sin usar secuencias de escape.

+0

Esto funcionó, muchas gracias. –

20

Ignacio acaba de dar la respuesta perfecta. Sólo un complemento: al convertir un trozo de cuerda de una codificación que tiene caracteres que no se encuentran en ASCII a Unicode, usted tiene que pasar la codificación como un parámetro:

>>> unicode("órgão") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128) 
>>> unicode("órgão", "UTF-8") 
u'\xf3rg\xe3o' 

Si no se puede decir lo que es la codificación original (UTF -8 en mi ejemplo) realmente no puede convertir a Unicode. Es una señal de que algo no es muy correcto en tus intenciones.

Por último, pero no menos importante, las codificaciones son bastante confusas. Esto comprehensive text about them puede dejarlos en claro.

+0

¿por qué unicode ("órgão", "UTF-8") no funciona en mi entorno Python 2.7? – superche

+0

@superche Quizás esté utilizando otra codificación en su terminal. ¿Cuál es la salida de 'print repr (" órgão ")' en su máquina? – brandizzi