Подтвердить что ты не робот

Преобразовать hash.digest() в unicode

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)

Строка HIS должна быть unicode, чтобы она была для меня использована, можно ли это сделать? Использование python 2.7, если это помогает...

4b9b3361

Ответ 1

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

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

Ответ 2

Игнасио просто дал прекрасный ответ. Просто добавьте: когда вы конвертируете некоторую строку из кодировки, которая имеет символы, не найденные в 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. Это сигнал о том, что что-то не совсем правильно в ваших намерениях.

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