<p>我认为这里有一个潜在的问题,调查并解决它可能是一个好主意,而不是试图掩盖症状。</p>
<p><code>\xc2\x95</code>是字符U+0095的UTF-8编码,它是一个<a href="http://www.unicode.org/charts/PDF/U0080.pdf">C1 control character</a>(消息等待)。你的图书馆不能处理这件事并不奇怪。但问题是,它是如何进入你的数据的?</p>
<p>一种很可能的情况是,它最初是<a href="http://en.wikipedia.org/wiki/Windows-1252">Windows-1252</a>编码中的字符0x95(BULLET),被错误地解码为U+0095而不是正确的U+2022,然后被编码为UTF-8。(日本术语<a href="http://en.wikipedia.org/wiki/Mojibake"><em>mojibake</em></a>描述了这种错误。)</p>
<p>如果这是正确的,那么您可以通过将原始字符放回Windows-1252,然后这次将其正确解码为Unicode来恢复它们。(在这些示例中,我使用的是Python3.3;在Python2中,这些操作有些不同。)</p>
<pre><code>>>> b'\x95'.decode('windows-1252')
'\u2022'
>>> import unicodedata
>>> unicodedata.name(_)
'BULLET'
</code></pre>
<p>如果要对0x80–0x99范围内的所有有效Windows-1252字符执行此更正,可以使用以下方法:</p>
<pre><code>def restore_windows_1252_characters(s):
"""Replace C1 control characters in the Unicode string s by the
characters at the corresponding code points in Windows-1252,
where possible.
"""
import re
def to_windows_1252(match):
try:
return bytes([ord(match.group(0))]).decode('windows-1252')
except UnicodeDecodeError:
# No character at the corresponding code point: remove it.
return ''
return re.sub(r'[\u0080-\u0099]', to_windows_1252, s)
</code></pre>
<p>例如:</p>
<pre><code>>>> restore_windows_1252_characters('\x95\x99\x85')
'•™…'
</code></pre>