擅长:python、mysql、java
<p>当您“复制并粘贴到字符串中”时,它可能不是unicode文本,除非您显式地在它前面加上<code>u</code>。你知道吗</p>
<p>为了md5一些东西,您需要一些实际的数据字节来散列。unicode字符串是表示特定字符序列的抽象,而不必有一个以字节表示的显式数值。你知道吗</p>
<p>因此,您需要指定一个像<code>utf8</code>这样的显式字符串编码,以将unicode字符串转换为一个字节序列,而md5这样的算法可以对其进行有意义的操作。你知道吗</p>
<p>特别是,在python2(您似乎正在使用)上,Python解释器尝试在需要编码时自动将unicode字符串转换为某些字节编码。但是,默认情况下,它(通常)尝试编码为ASCII,因此如果字符串包含纯ASCII范围之外的任何字符,您将得到<code>UnicodeEncodeError</code>。你知道吗</p>
<p>顺便说一句,如果您将非ASCII字符粘贴到终端中并尝试生成纯字符串文字(不使用<code>u</code>),则通常会起作用,因为在这种情况下,Python将再次自动对字符串进行字节编码,但使用的编码由您的区域设置和其他环境源确定。你知道吗</p>
<p>一般来说,只需将字符串转换为一些特定的编码,如<code>mystring.encode('utf8')</code>。在调用<code>encode()</code>之前,首先确保它是一个实际的<code>unicode</code>类型的字符串,而不是一个包含某些任意编码字符的字节<code>str</code>,否则您可以根据具体情况获取<code>UnicodeDecodeError</code>或<a href="https://en.m.wikipedia.org/wiki/Mojibake" rel="nofollow noreferrer">mojibake</a>。你知道吗</p>