Исправление ошибки Unicode при создании контрольной суммы - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь отладить следующую проблему, возникающую при создании контрольной суммы md5 для строки.

У меня есть код Unicode следующим образом:

>>>>> 129165Warner Bros.MovieESEn la Arena (Gira 30 Años y Un Día / Las Ventas 26 de Junio de 2015)2015SDBUYEn la Arena (Gira 30 Años y Un Día / Las Ventas 26 de Junio de 2015)1065227811https://itunes.apple.com/es/movie/id1065227811Live Not Avail'dOffer missing in availOpenLiveNo avail found-2TrueiTunes47160835 
<type 'unicode'>

Однако, когда я пытаюсьи выполнить контрольную сумму со следующим:

hashlib.md5(string_for_checksum).hexdigest()

Я получаю следующую ошибку:

UnicodeEncodeError: кодек 'ascii' не может кодировать символ u '\ xf1' в позиции47: порядковый номер не в диапазоне (128)

Странно то, что когда я копирую и вставляю строку, она работает нормально, но при запуске «внутри программы» она всегда дает мне Юникодошибки.Что может быть причиной этого?Может быть, это проблема кодировки файла?

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Сначала нужно закодировать его в байтовый объект:

hashlib.md5(string_for_checksum.encode('utf-8')).hexdigest()
0 голосов
/ 25 апреля 2019

Когда вы «копируете и вставляете в строку», он, вероятно, не является литералом юникода, если вы явно не добавили префикс u.

Для того, чтобы md5 что-то вам понадобилось, некоторые реальные байты данных для хеширования. Строка Unicode - это абстракция, представляющая конкретные последовательности символов без необходимости иметь одно явное числовое значение, выраженное в байтах.

Таким образом, вам нужно указать явную строковую кодировку, такую ​​как utf8, чтобы преобразовать строку Юникода в последовательность байтов, с которой осмысленно может работать алгоритм, такой как md5.

В частности, в Python 2 (который вы, похоже, используете) интерпретатор Python пытается автоматически преобразовать строки юникода в некоторую байтовую кодировку, когда требуется кодировка. Однако по умолчанию он (обычно) пытается кодировать в ASCII, поэтому, если строка содержит какие-либо символы вне простого диапазона ASCII, вы получите UnicodeEncodeError.

Кстати, если вы вставите не-ASCII-символы в свой терминал и попытаетесь сделать обычную строку литералом (без u, это будет часто работать, потому что в этом случае Python снова автоматически закодирует вашу строку, используя кодировку определяется вашим языком и другими источниками окружающей среды.

Как правило, просто преобразуйте строку в некоторую конкретную кодировку, например mystring.encode('utf8'). Прежде чем вызывать encode(), сначала убедитесь, что это настоящая строка типа unicode, а не байты str, содержащие символы в произвольной кодировке, иначе вы можете получить UnicodeDecodeError s или mojibake в зависимости по делу.

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