хэш-строка в кодировке Юникод - PullRequest
44 голосов
/ 13 марта 2011

Я пытаюсь хэшировать некоторые строки 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ћ ... • ΔљΔ • ... љΔ • ... љΔ • ... Δљ • ... Δљ • ... љΔ • ... • ... Д Δ • ... Δ • Δ ... • ÷ Δ • ...÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •… ÷ ∆ •…

что я должен исправить?

Ответы [ 3 ]

84 голосов
/ 14 марта 2011

Очевидно, 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 , и эта статья Джоэла Спольски .

3 голосов
/ 19 марта 2014

Используйте формат кодирования utf-8, попробуйте этот простой способ,

>>> import hashlib
>>> hashlib.sha256(str(random.getrandbits(256)).encode('utf-8')).hexdigest()
'cd183a211ed2434eac4f31b317c573c50e6c24e3a28b82ddcb0bf8bedf387a9f'
0 голосов
/ 25 февраля 2018

Вы хешируйте байты, а не строки.Таким образом, вы должны знать, какие байты вы действительно хотите хэшировать, если представление строки в памяти utf8, представление строки в памяти utf16 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...