2011-10-01 8 views
6

Esta línea¿Cómo puede codificar ('ascii', 'ignorar') lanzar un UnicodeDecodeError?

data = get_url_contents(r[0]).encode('ascii', 'ignore') 

produce este error

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

¿Por qué? Supuse que porque estoy usando 'ignorar' que sería imposible tener errores de decodificación al guardar la salida a un valor de una variable de cadena.

+0

El problema es con _decoding_, no _encoding_. Ellos no son lo mismo. – agf

+0

¿Qué hace 'get_url_contents'? Parece que la excepción se plantea en esa función, no en 'codificar'. –

+0

@Trindaz, 0xc3 no es un carácter ASCII. –

Respuesta

3

Debido a una peculiaridad de Python 2, puede llamar al encode en una cadena de bytes (es decir, texto que ya está codificado). En este caso, primero intenta convertirlo en un objeto Unicode decodificando con ascii. Por lo tanto, si get_url_contents devuelve una cadena de bytes, su línea hace efectivamente esto:

get_url_contents(r[0]).decode('ascii').encode('ascii', 'ignore') 

En Python 3, cadenas de bytes no tienen un método encode, por lo que el mismo problema sería sólo causar una AttributeError.

(Por supuesto, no sé que este es el problema - que podría estar relacionado con la función get_url_contents Pero lo que he descrito anteriormente es mi mejor conjetura.)

Cuestiones relacionadas