utf8 unicodedecodeerror start invalid 0xff 0xf3 0xe9 0xba 0xb0 0xa3 0xa2 0x90 python linux

python - start - UnicodeDecodeError: el codec ''utf8'' no puede decodificar el byte 0x9c



unicodedecodeerror utf 8 codec can t decode byte 0xf3 in position 11 invalid continuation byte (7)

¿Qué puede hacer si necesita hacer un cambio en un archivo, pero no sabe la codificación del archivo? Si sabe que la codificación es compatible con ASCII y solo desea examinar o modificar las partes ASCII, puede abrir el archivo con el controlador de errores surrogateescape:

with open(fname, ''r'', encoding="ascii", errors="surrogateescape") as f: data = f.read()

Tengo un servidor de socket que se supone que debe recibir caracteres válidos UTF-8 de los clientes.

El problema es que algunos clientes (principalmente piratas informáticos) están enviando todo tipo de datos incorrectos.

Puedo distinguir fácilmente al cliente original, pero estoy registrando en los archivos todos los datos enviados para poder analizarlos más tarde.

A veces obtengo caracteres como este, que causan el error UnicodeDecodeError .

Necesito poder hacer la cadena UTF-8 con o sin esos caracteres.

Actualizar:

Para mi caso particular, el servicio de socket era un MTA y, por lo tanto, solo espero recibir comandos ASCII como:

EHLO example.com MAIL FROM: <[email protected]> ...

Estaba registrando todo esto en JSON.

Luego, algunas personas sin buenas intenciones decidieron vender todo tipo de basura.

Es por eso que para mi caso específico es perfectamente correcto quitar los caracteres que no son ASCII.


Cambiar el motor de C a Python hizo el truco por mí.

El motor es C:

pd.read_csv(gdp_path, sep=''/t'', engine=''c'')

El códec ''utf-8'' no puede decodificar el byte 0x92 en la posición 18: byte de inicio no válido

El motor es Python:

pd.read_csv(gdp_path, sep=''/t'', engine=''python'')

No hay errores para mí.


En caso de que alguien tenga el mismo problema. YouCompleteMe usando vim con YouCompleteMe , no pude iniciar ycmd con este mensaje de error, lo que hice es: export LC_CTYPE="en_US.UTF-8" , el problema desapareció.


Este tipo de problema surge para mí ahora que me mudé a Python 3. No tenía idea de que Python 2 era simplemente un problema con la codificación de archivos.

Encontré esta buena explicación de las diferencias y cómo encontrar una solución después de que nada de lo anterior funcionó para mí.

http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html

En resumen, para hacer que Python 3 se comporte de la manera más similar posible al uso de Python 2:

with open(filename, encoding="latin-1") as datafile: # work on datafile here

Sin embargo, lea el artículo, no hay una solución única para todos.


Tuve el mismo problema con UnicodeDecodeError y lo resolví con esta línea. No sé si es la mejor manera pero funcionó para mí.

str = str.decode(''unicode_escape'').encode(''utf-8'')


http://docs.python.org/howto/unicode.html#the-unicode-type

str = unicode(str, errors=''replace'')

o

str = unicode(str, errors=''ignore'')

Nota: esta solución eliminará (ignorará) los caracteres en cuestión que devuelven la cadena sin ellos. Solo use esto si su necesidad es despojarlos, no convertirlos.

Alternativamente, use el método abierto del módulo de codecs para leer en el archivo:

import codecs with codecs.open(file_name, "r",encoding=''utf-8'', errors=''ignore'') as fdata:


>>> ''/x9c''.decode(''cp1252'') u''/u0153'' >>> print ''/x9c''.decode(''cp1252'') œ