Конвертировать hash.digest () в Юникод - PullRequest
12 голосов
/ 07 июня 2011
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)

Строка ДОЛЖНА быть в юникоде, чтобы она мне пригодилась, можно ли это сделать? Использование python 2.7, если это поможет ...

Ответы [ 2 ]

21 голосов
/ 07 июня 2011

Игнасио только что дал идеальный ответ. Просто дополнение: когда вы конвертируете некоторую строку из кодировки с символами, не найденными в ASCII, в Unicode, вы должны передать кодировку в качестве параметра:

>>> 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'

Если вы не можете сказать, какова оригинальная кодировка (в моем примере UTF-8), вы действительно не сможете конвертировать в Unicode. Это сигнал о том, что в ваших намерениях что-то не так.

И последнее, но не менее важное: кодировки довольно запутанные вещи. Этот подробный текст о них может прояснить их.

11 голосов
/ 07 июня 2011

Результат .digest() является байтовой строкой¹, поэтому преобразовывать его в Unicode бессмысленно.Используйте .hexdigest(), если вы хотите удобочитаемое представление.

¹ Некоторые строки байтов можно преобразовать в Unicode, но строки байтов, возвращаемые .digest(), не содержат текстовых данных.Они могут содержать любой байт, включая нулевой байт: обычно они не печатаются без использования escape-последовательностей.

...