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

2024-10-04 03:26:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图调试我在为字符串生成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' codec can't encode character u'\xf1' in position 47: ordinal not in range(128)

奇怪的是,当我复制并粘贴字符串时,它工作正常,但是当在“程序内”运行时,它总是给我unicode错误。是什么原因造成的?可能是文件编码问题吗?你知道吗


Tags: 字符串inos错误unicodede校验md5
2条回答

首先需要将其编码为bytes对象:

hashlib.md5(string_for_checksum.encode('utf-8')).hexdigest()

当您“复制并粘贴到字符串中”时,它可能不是unicode文本,除非您显式地在它前面加上u。你知道吗

为了md5一些东西,您需要一些实际的数据字节来散列。unicode字符串是表示特定字符序列的抽象,而不必有一个以字节表示的显式数值。你知道吗

因此,您需要指定一个像utf8这样的显式字符串编码,以将unicode字符串转换为一个字节序列,而md5这样的算法可以对其进行有意义的操作。你知道吗

特别是,在python2(您似乎正在使用)上,Python解释器尝试在需要编码时自动将unicode字符串转换为某些字节编码。但是,默认情况下,它(通常)尝试编码为ASCII,因此如果字符串包含纯ASCII范围之外的任何字符,您将得到UnicodeEncodeError。你知道吗

顺便说一句,如果您将非ASCII字符粘贴到终端中并尝试生成纯字符串文字(不使用u),则通常会起作用,因为在这种情况下,Python将再次自动对字符串进行字节编码,但使用的编码由您的区域设置和其他环境源确定。你知道吗

一般来说,只需将字符串转换为一些特定的编码,如mystring.encode('utf8')。在调用encode()之前,首先确保它是一个实际的unicode类型的字符串,而不是一个包含某些任意编码字符的字节str,否则您可以根据具体情况获取UnicodeDecodeErrormojibake。你知道吗

相关问题 更多 >