Строка хеширования unicode в python
Я пытаюсь использовать некоторые строки unicode:
hashlib.sha1(s).hexdigest()
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-81:
ordinal not in range(128)
где s
что-то вроде:
œΣ¡ ™ £ ¢ ∞§¶ • ªº- ≠ œΣ'® † ¥ ¨øπ "'åß∂ƒ © ˙Δ˚¬... æΩ≈ç√∫~μ≤≥ ÷ åйцукенгшщзхъфывапролджэячсмитьбююю..юбьтијџўќ † њѓѕ '' "" " "\dzћ ÷... • Δљl" єђxcvіƒm≤≥ї @# $© ^ &! * (() ---------- ΔΔΔΔΔΔΔΔΔ ΔΔΔΔΔΔΔΔΔΔ •... ÷ ÷ ћzdzћ... • ΔљlљΔ •... ÷ ÷ ћzћ... • ΔљΔ •... • љΔ... љΔ •... Δљ •... Δљ •... љΔ •... •... Д Δ •... Δ • Δ... • ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •... ÷ Δ •...
что я должен исправить?
Ответы
Ответ 1
По-видимому hashlib.sha1
не ожидает объект unicode
, а скорее последовательность байтов в объекте str
. Кодирование строки unicode
в последовательность байтов (с использованием, например, кодировки UTF-8) должно исправить ее:
>>> import hashlib
>>> s = u'é'
>>> hashlib.sha1(s.encode('utf-8'))
<sha1 HASH object @ 029576A0>
Ошибка заключается в том, что она пытается автоматически преобразовать объект unicode
в str
, используя по умолчанию ascii
кодировку, которая не может обрабатывать все те символы, отличные от ASCII (поскольку ваша строка не является чистый ASCII).
Хорошей отправной точкой для получения дополнительной информации о Unicode и кодировках является Python docs, и этот статьи Джоэла Спольского.
Ответ 2
Используйте формат кодирования utf-8
, попробуйте этот простой способ,
>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'