2009-12-16 16 views
5

Tengo una función de mi programa donde el usuario puede cargar un archivo csv, que mi programa realiza y usa como entrada. Tengo un usuario quejándose sobre un problema donde su entrada arroja un error. El error se debe a que hay un carácter ilegal codificado incorrectamente. Los caracteres están a continuación:¿Cómo desinfectar por completo una cadena de caracteres ilegales en python?

A veces aparece como un diamante con un "?" en el medio. A veces aparece como un diamante doble con "?" en el medio, a veces aparece como "\ xa0", y a veces aparece como "\ xa0 \ xa0".

En mi programa si lo hago:

print str_with_weird_char 

la striong se mostrará en mi terminal con el diamante "?" en lugar del personaje extraño. Si copio + pegar esa cadena en ipython, sino que terminará con este mensaje:

In [1]: g="blah��blah" 
WARNING: 
******** 
You or a %run:ed script called sys.stdin.close() or sys.stdout.close()! 
Exiting IPython! 

aviso cómo el diamante "?" es doble ahora Por alguna razón copia + pega el doble que hace ...

En la página de rastreo de Django, que se ve así:

UnicodeDecodeError at /chris/import.html 
('ascii', 'blah \xa0 BLAH', 14, 15, 'ordinal not in range(128)') 

Lo que me meta la pata es que yo no puedo hacer nada con este cadena sin que arroje un exceso. Intenté unicode(), probé str(), probé .encode(), probé .encode ("utf-8"), sin importar lo que arroje un error.

¿Qué puedo hacer para que esto funcione?

+0

Por cierto, la razón por la que "no se puede hacer nada" con ella es probablemente porque todas las cosas que probó implicaron el tipeo de expresiones en el aviso. El intérprete interactivo muestra el resultado de cada expresión llamando a repr() en él. A veces eso lleva a descodificar errores porque su consola no maneja Unicode (u otras razones?). Si obtienes algo así, intenta asignarlo a un nombre ficticio (por ejemplo, "x = foo" en lugar de simplemente "foo") y eso generalmente no mostrará una excepción. Entonces sabes que la excepción es espuria. –

Respuesta

6

se puede pasar, "ignorar" para saltar caracteres no válidos en .encode/.decode como "ILLEGAL".decode("utf8","ignore")

>>> "ILLEGA\xa0L".decode("utf8") 
... 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa0 in position 6: unexpected code byte 

>>> "ILLEGA\xa0L".decode("utf8","ignore") 
u'ILLEGAL' 
>>> 
2

Declarar la codificación en la segunda línea del script. Realmente tiene que ser el segundo. Como

#!/usr/bin/python 
# coding=utf-8 

Esto podría ser suficiente para resolver su problema por sí mismo. De lo contrario, consulte str.encode ('utf-8') y str.decode ('utf-8').

Cuestiones relacionadas