<p>你问(在评论中)“”“这就是让我困惑的地方。它是怎么从原来的口音变成现在的?当你说用utf8和latin1进行双重编码时,总共是3种编码(2 utf8+1 latin1)吗?从原始状态到当前状态的编码顺序是什么</p>
<p>在马克·拜尔斯的回答中,他说“你所拥有的似乎是一种未正确解码的UTF-8编码”。你已经接受了他的回答。但你还是很困惑?好的,这是一个接一个的描述:</p>
<p>注意:所有字符串都将使用(隐式地)<code>repr()</code>显示。<code>unicodedata.name()</code>将用于验证内容。这样,控制台编码的变化就不会混淆字符串的解释。</p>
<p>初始状态:您有一个名为u1的unicode对象。它包含e-acute:</p>
<pre><code>>>> u1 = u'\xe9'
>>> import unicodedata as ucd
>>> ucd.name(u1)
'LATIN SMALL LETTER E WITH ACUTE'
</code></pre>
<p>将u1编码为UTF-8并将结果命名为:</p>
<pre><code>>>> s = u1.encode('utf8')
>>> s
'\xc3\xa9'
</code></pre>
<p>你用latin1解码s——不正确;s是用utf8编码的,不是latin1。结果是毫无意义的垃圾。</p>
<pre><code>>>> u2 = s.decode('latin1')
>>> u2
u'\xc3\xa9'
>>> ucd.name(u2[0]); ucd.name(u2[1])
'LATIN CAPITAL LETTER A WITH TILDE'
'COPYRIGHT SIGN'
>>>
</code></pre>
<p>请理解:<code>unicode_object.encode('x').decode('y)</code>当x!=y通常是胡说八道;如果你运气好,它会引发一个异常;如果你运气不好,它会无声地制造出胡言乱语。另外,请理解,无声地创建乱七八糟并不是一个bug——Python(或任何其他语言)无法检测出有人犯下了无意义的错误。这尤其适用于涉及latin1的情况,因为所有256个代码点都将1映射到1,其中包含前256个Unicode代码点,因此无法从str_object.decode('latin1')获取UnicodeDecodeError。</p>
<p>当然,不正常的(人们希望这是不正常的)你可能需要做<code>gibberish_unicode_object.encode('y').decode('x')</code>来扭转这样的胡说八道,正如你的问题的各种答案所建议的那样。</p>