Python无法将错误的unicode编码为ascii

Python无法将错误的unicode编码为ascii,python,unicode,Python,Unicode,我有一些Python代码,它接收到一个包含坏unicode的字符串。当我试图忽略坏字符时,Python仍然会阻塞(版本2.6.1)。下面是如何复制它: s = 'ad\xc2-ven\xc2-ture' s.encode('utf8', 'ignore') 它抛出 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 2: ordinal not in range(128) 我做错了什么?在Python 2.

我有一些Python代码,它接收到一个包含坏unicode的字符串。当我试图忽略坏字符时,Python仍然会阻塞(版本2.6.1)。下面是如何复制它:

s = 'ad\xc2-ven\xc2-ture'
s.encode('utf8', 'ignore')
它抛出

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 2: ordinal not in range(128)

我做错了什么?

在Python 2.x中,将字符串转换为unicode实例是
str.decode()

 >>> s.decode("ascii", "ignore")
 u'ad-ven-ture'
您混淆了“unicode”和“utf-8”。您的字符串
s
不是unicode;它是一种特殊编码的bytestring(但不是UTF-8,更可能是iso-8859-1或诸如此类)。从bytestring到
unicode
是通过解码数据而不是编码完成的。从unicode到bytestring就是编码。也许您想让
s
成为unicode字符串:

>>> s = u'ad\xc2-ven\xc2-ture'
>>> s.encode('utf8', 'ignore')
'ad\xc3\x82-ven\xc3\x82-ture'
或者,您可能希望将bytestring视为UTF-8,但忽略无效序列,在这种情况下,您将使用“ignore”作为错误处理程序对bytestring进行解码:

>>> s = 'ad\xc2-ven\xc2-ture'
>>> u = s.decode('utf-8', 'ignore')
>>> u
u'adventure'
>>> u.encode('utf-8')
'adventure'

你确定你不想用s.decode('utf8','ignore')来代替吗?是的,你是对的。哎哟:)注意,使用OP的编码(utf-8)而不是ASCII,您将得到
u'adventure'
。实际上我更喜欢
unicode(utf8\u字符串,'utf-8','ignore')
,因为创建unicode字符串更清晰。还有
s.decode('ascii','replace')
可以用来了解问题。