我正在尝试调试为字符串生成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'编解码器无法在位置47处编码字符u'\ xf1':序数不在范围(128)中
奇怪的是,当我复制并粘贴字符串时,它可以正常工作,但是在“在程序内”运行时,它总是会给我unicode错误。是什么原因造成的?可能是文件编码问题?
答案 0 :(得分:1)
您需要先将其编码为字节对象:
1 2 3
答案 1 :(得分:0)
“复制并粘贴字符串”时,它可能不是unicode文字,除非您显式为其加上u
前缀。
为了对内容进行md5处理,您需要一些实际的数据字节来进行哈希处理。 unicode字符串是一种抽象形式,表示特定的字符序列,而不必具有一个表示为字节的显式数值。
因此,您需要指定像utf8
这样的显式字符串编码才能将unicode字符串转换为字节序列,例如md5这样的算法可以有意义地对其进行操作。
尤其是在Python 2(您似乎正在使用)上,Python解释器会在需要编码时尝试自动将unicode字符串转换为某种字节编码。但是,默认情况下,它通常会尝试编码为ASCII,因此,如果字符串中包含任何超出纯ASCII范围的字符,您都会得到一个UnicodeEncodeError
。
顺便说一句,如果您将非ASCII字符粘贴到终端中并尝试制作纯文本字符串(没有u
,它通常会起作用,因为在这种情况下,Python会再次自动对字符串进行字节编码,但是使用由您的语言环境和其他环境来源决定的编码。
通常,只需将字符串转换为某些特定的编码,例如mystring.encode('utf8')
。只需在调用unicode
之前先确保它是一个实际的encode()
类型的字符串,而不是包含以任意编码的字符的字节str
即可,否则您可以获取UnicodeDecodeError
或mojibake视情况而定。