Python无法将糟糕的unicode编码为ascii

时间:2011-05-25 13:03:33

标签: 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)

我做错了什么?

2 个答案:

答案 0 :(得分:10)

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

 >>> s.decode("ascii", "ignore")
 u'ad-ven-ture'

答案 1 :(得分:8)

你混淆了“unicode”和“utf-8”。你的字符串s不是unicode;它是特定编码中的字节串(但不是UTF-8,更可能是iso-8859-1等。)从字节串到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'的字节串作为错误处理程序:

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