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