<p>在Python2.x中使用UTF-8编码的Unicode数据时,这是一个常见的问题。在2.4和2.7之间的一些地方,对这一问题的处理已经发生了变化,所以突然出现错误也就不足为奇了。</p>
<p>错误的来源是<code>print</code>:在Python 2.x中,<code>print</code>不尝试假设终端支持什么编码。它只播放save并假设<code>ascii</code>是唯一受支持的字符集(这意味着0到127之间的字符可以,其他所有字符都会出错)。</p>
<p>现在将<code>COMObject</code>转换为字符串。<code>str</code>对于Python 2.x来说只是一堆字节(值0到255)。它没有编码。</p>
<p>把两者结合起来是个麻烦。当Python打印时,它试图验证输入(字符串)并突然发现UTF-8编码字符(UTF-8添加这些奇怪的<code>\xe1</code>标记,这些标记告诉解码器下一个字节在某种程度上是特殊的;<a href="https://en.wikipedia.org/wiki/UTF-8" rel="nofollow noreferrer">check Wikipedia for the gory details</a>)。</p>
<p>这时<code>ascii</code>编码器说:对不起,在那里帮不了你。</p>
<p>这意味着您可以使用这个值,比较它和这样的值,但是您不能<code>print</code>它。解决打印问题的一个简单方法是:</p>
<pre><code>s = str(cell_value) # Convert COM -> UTF-8 encoded string
print repr(s) # repr() converts anything to ascii
</code></pre>
<p>如果您的终端支持UTF-8,那么您需要告诉Python:</p>
<pre><code>import sys
import codecs
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
</code></pre>
<p>您还应该看看<code>sys.stdout.encoding</code>,它告诉Python当前认为输出编码是/应该是什么。当Python2被正确配置(如在现代Linux发行版上)时,应该自动使用正确的输出编解码器。</p>
<p>相关:</p>
<ul>
<li><a href="https://docs.python.org/2/howto/unicode.html" rel="nofollow noreferrer">Python 2 Unicode howto</a></li>
<li><a href="http://pyvideo.org/video/948/pragmatic-unicode-or-how-do-i-stop-the-pain" rel="nofollow noreferrer">Pragmatic Unicode, or, How do I stop the pain?</a></li>
<li><a href="https://stackoverflow.com/questions/492483/setting-the-correct-encoding-when-piping-stdout-in-python?lq=1">Setting the correct encoding when piping stdout in Python</a></li>
</ul>