擅长:python、mysql、java
<p>为了打印文本而将文本转换为unicode是没有意义的。以unicode格式处理数据,将其转换为某种编码以进行输出。</p>
<p>代码的作用是:在python 2上,所以默认的字符串类型(<code>str</code>)是bytestring。在您的语句中,您从一些utf编码的字节字符串开始,将它们转换为unicode,并用引号(为了组合成一个字符串而强制转换为unicode的常规<code>str</code>)将它们括起来。然后将这个unicode字符串传递给<code>print</code>,后者将其推送到<code>sys.stdout</code>。为此,需要将其转换为字节。如果您正在向Windows控制台写入数据,它可以以某种方式进行协商,但是如果您重定向到一个普通的哑文件,它就会返回到ascii并抱怨,因为这样做的方法是没有损失的。</p>
<p>解决方案:不要给<code>print</code>一个unicode字符串。“将“it yourself”编码为您选择的表示:</p>
<pre><code>print "Latin-1:", "unicode über alles!".decode('utf-8').encode('latin-1')
print "Utf-8:", "unicode über alles!".decode('utf-8').encode('utf-8')
print "Windows:", "unicode über alles!".decode('utf-8').encode('cp1252')
</code></pre>
<p>所有这些都应该在重定向时毫无怨言地工作。它可能不会显示在屏幕上,但是用记事本或其他东西打开输出文件,看看编辑器是否设置为查看格式。(只有Utf-8有被发现的希望。cp1252可能是Windows的默认值)。</p>
<p>一旦你搞定了,清理你的代码,避免使用打印文件输出。使用<code>codecs</code>模块,用<code>codecs.open</code>打开文件,而不是直接打开。</p>
<p>另外,如果您正在解码一个<code>utf-8</code>字符串,那么到unicode的转换应该不会丢失:您不需要<code>errors=ignore</code>标志。当您转换为ascii或拉丁语-2或其他类型时,这是合适的,并且您只想删除目标代码页中不存在的字符。</p>