修复校验和创建时的Unicode错误

时间:2019-04-24 22:36:43

标签: python python-2.7 unicode

我正在尝试调试为字符串生成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错误。是什么原因造成的?可能是文件编码问题?

2 个答案:

答案 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即可,否则您可以获取UnicodeDecodeErrormojibake视情况而定。