<p>Unicode字符<code>u'\xce0'</code>和<code>u'\xc9'</code>没有任何对应的ASCII值。所以,如果不想丢失数据,就必须以某种有效的ASCII方式对数据进行编码。选项包括:</p>
<pre><code>>>> print s.encode('ascii', errors='backslashreplace')
ABRA\xc3O JOS\xc9
>>> print s.encode('ascii', errors='xmlcharrefreplace')
ABRA&#195;O JOS&#201;
>>> print s.encode('unicode-escape')
ABRA\xc3O JOS\xc9
>>> print s.encode('punycode')
ABRAO JOS-jta5e
</code></pre>
<p>所有这些都是ASCII字符串,包含了原始Unicode字符串中的所有信息(因此它们都可以在不丢失数据的情况下反转),但对于最终用户来说,它们都不是那么漂亮(而且它们都不能通过<code>decode('ascii')</code>反转)。</p>
<p>有关详细信息,请参见<a href="http://docs.python.org/2/library/stdtypes.html#str.encode" rel="noreferrer">^{<cd4>}</a>、<a href="http://docs.python.org/2/library/codecs.html#python-specific-encodings" rel="noreferrer">Python Specific Encodings</a>和<a href="http://docs.python.org/2/howto/unicode.html" rel="noreferrer">Unicode HOWTO</a>。</p>
<hr/>
<p>顺便说一下,当有些人说“ASCII”时,他们实际上不是指“ASCII”,而是指“ASCII的超集的任何8位字符集”或“我想到的某个特定的8位字符集”。如果这就是您的意思,那么解决方案是编码到正确的8位字符集:</p>
<pre><code>>>> s.encode('utf-8')
'ABRA\xc3\x83O JOS\xc3\x89'
>>> s.encode('cp1252')
'ABRA\xc3O JOS\xc9'
>>> s.encode('iso-8859-15')
'ABRA\xc3O JOS\xc9'
</code></pre>
<p>最困难的是知道你指的是哪一个角色集。如果您同时编写生成8位字符串的代码和使用8位字符串的代码,并且您不太清楚,那么您的意思是UTF-8。如果使用8位字符串的代码是<code>open</code>函数或为页面或其他内容提供服务的web浏览器,则事情会更复杂,如果没有更多信息,就没有简单的答案。</p>