2011-05-25 8 views
5

Tengo un código de Python que está recibiendo una cadena con unicode incorrecto. Cuando trato de ignorar los caracteres incorrectos, Python aún se ahoga (versión 2.6.1). Así es como se puede reproducir:Python no puede codificar unicode incorrecto para ascii

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

arroja

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

¿Qué estoy haciendo mal?

+2

¿Estás seguro de que no quieres s.decode ('utf8', 'ignorar') en su lugar? – Dan

+0

Sí, tienes razón. Whoops :) –

Respuesta

10

la conversión de una cadena a una instancia de Unicode es str.decode() en Python 2.x:

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

Tenga en cuenta que con la codificación de OP (utf-8) en lugar de ASCII obtendrá 'u'adventure''. De hecho, prefiero 'unicode (utf8_string, 'utf-8', 'ignore')', ya que está más claro que está creando una cadena Unicode. –

+0

También hay 's.decode ('ascii', 'replace')' que se puede usar para hacerse una idea de los problemas. – Wernight

8

Usted es confuso "Unicode" y "UTF-8". Su cadena s no es unicode; es una cadena de bytes en una codificación particular (pero no UTF-8, más probablemente iso-8859-1 o similar). Pasar de una cadena de bytes a unicode se realiza por descodificando los datos, no codificando. Pasar de unicode a bytestring es la codificación. ¿La intención era hacer s una cadena Unicode:

>>> s = u'ad\xc2-ven\xc2-ture' 
>>> s.encode('utf8', 'ignore') 
'ad\xc3\x82-ven\xc3\x82-ture' 

O tal vez usted quiere tratar la cadena de bytes con la codificación UTF-8, pero ignorar secuencias no válidos, en cuyo caso lo haría decodificación la cadena de bytes con 'ignorar' como el gestor de errores:

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