擅长:python、mysql、java
<p>首先,当从文件、管道、套接字、终端等读取数据时,<em>将</em>数据解码为Unicode(编码的<em>缺失</em>);在发送/持久化数据时,<em>将</em>Unicode编码为适当的字节编码。我怀疑这是你问题的根源。在</p>
<p>web服务应该在接收到的头或数据中声明编码。<code>print</code>通常自动将Unicode编码为终端的编码(通过<code>sys.stdout.encoding</code>发现),或者在没有编码的情况下,<code>ascii</code>。如果目标编码不支持数据中的字符,您将得到一个<code>UnicodeEncodeError</code>。在</p>
<p>因为这不是您收到的错误,您应该张贴一些代码,以便我们可以看到您正在做什么。最有可能的是,<em>编码</em>字节串,而不是<em>解码</em>。下面是一个例子:</p>
<pre><code>>>> data = '\xc2\xbd' # UTF-8 encoded 1/2 symbol.
>>> data.encode('cp437')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\dev\python\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 0: ordinal not in range(128)
</code></pre>
<p>我在这里所做的是对字节串调用<code>encode</code>。由于<code>encode</code>需要一个Unicode字符串,Python在编码到<code>cp437</code>之前,首先使用默认的<code>ascii</code>编码将字节字符串解码为Unicode。在</p>
<p>通过解码而不是编码数据来解决这个问题,<code>print</code>将自动编码到stdout。只要您的终端支持数据中的字符,它就会正确显示:</p>
^{pr2}$