Когда вы «копируете и вставляете в строку», он, вероятно, не является литералом юникода, если вы явно не добавили префикс u
.
Для того, чтобы md5 что-то вам понадобилось, некоторые реальные байты данных для хеширования. Строка Unicode - это абстракция, представляющая конкретные последовательности символов без необходимости иметь одно явное числовое значение, выраженное в байтах.
Таким образом, вам нужно указать явную строковую кодировку, такую как utf8
, чтобы преобразовать строку Юникода в последовательность байтов, с которой осмысленно может работать алгоритм, такой как md5.
В частности, в Python 2 (который вы, похоже, используете) интерпретатор Python пытается автоматически преобразовать строки юникода в некоторую байтовую кодировку, когда требуется кодировка. Однако по умолчанию он (обычно) пытается кодировать в ASCII, поэтому, если строка содержит какие-либо символы вне простого диапазона ASCII, вы получите UnicodeEncodeError
.
Кстати, если вы вставите не-ASCII-символы в свой терминал и попытаетесь сделать обычную строку литералом (без u
, это будет часто работать, потому что в этом случае Python снова автоматически закодирует вашу строку, используя кодировку определяется вашим языком и другими источниками окружающей среды.
Как правило, просто преобразуйте строку в некоторую конкретную кодировку, например mystring.encode('utf8')
. Прежде чем вызывать encode()
, сначала убедитесь, что это настоящая строка типа unicode
, а не байты str
, содержащие символы в произвольной кодировке, иначе вы можете получить UnicodeDecodeError
s или mojibake в зависимости по делу.