擅长:python、mysql、java
<p>当您得到一个<code>UnicodeEncodeError</code>时,这意味着在代码中的某个地方,您可以直接将字节字符串转换为unicode字符串。默认情况下,在Python 2中它使用ascii编码,在Python3中使用utf8编码(这两种编码都可能失败,因为不是每个字节在两种编码中都有效)</p>
<p>为了避免这种情况,必须使用显式解码。</p>
<p>如果输入文件中可能有两种不同的编码,其中一种接受任何字节(如UTF8和Latin1),则可以尝试先将字符串转换为first,如果发生UnicodeDecodeError,则使用第二种编码。</p>
<pre><code>def robust_decode(bs):
'''Takes a byte string as param and convert it into a unicode one.
First tries UTF8, and fallback to Latin1 if it fails'''
cr = None
try:
cr = bs.decode('utf8')
except UnicodeDecodeError:
cr = bs.decode('latin1')
return cr
</code></pre>
<p>如果不知道原始编码并且不关心非ascii字符,可以将<code>decode</code>方法的可选<code>errors</code>参数设置为<code>replace</code>。任何有问题的字节都将被替换(从标准库文档中):</p>
<blockquote>
<p>Replace with a suitable replacement character; Python will use the official U+FFFD REPLACEMENT CHARACTER for the built-in Unicode codecs on decoding and ‘?’ on encoding.</p>
</blockquote>
<pre><code>bs.decode(errors='replace')
</code></pre>