Tengo un servidor de socket que se supone que recibe caracteres válidos UTF-8 de los clientes.
El problema es que algunos clientes (principalmente piratas informáticos) envían todo el tipo de datos incorrectos sobre él.
Puedo distinguir fácilmente al cliente genuino, pero estoy ingresando a los archivos todos los datos enviados para poder analizarlos más tarde.
A veces obtengo caracteres como este œ
que causan el UnicodeDecodeError
error.
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: <john.doe@example.com>
...
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 está perfectamente bien quitar los caracteres no ASCII.
fuente
Respuestas:
http://docs.python.org/howto/unicode.html#the-unicode-type
o
Nota: Esto eliminará (ignorará) los caracteres en cuestión devolviendo la cadena sin ellos.
Para mí, este es el caso ideal, ya que lo estoy usando como protección contra la entrada no ASCII que mi aplicación no permite.
Alternativamente: utilice el método abierto del
codecs
módulo para leer en el archivo:fuente
str.decode('cp1252').encode('utf-8')
'\xc0msterdam'
que se convierte enu'\ufffdmsterdam'
reemplazaropen(file_name, "rb")
y luego aplique el enfoque de Ben de los comentarios anterioresCambiar el motor de C a Python hizo el truco para mí.
El motor es C:
El motor es Python:
No hay errores para mi.
fuente
csv
archivo enorme . Podría provocar unOutOfMemory
error o un reinicio automático del kernel de su computadora portátil. Debe configurar elencoding
en este caso.Este tipo de problema surge para mí ahora que me mudé a Python 3. No tenía idea de que Python 2 simplemente estaba resolviendo cualquier 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:
Sin embargo, lea el artículo, no hay una solución única para todos.
fuente
fuente
used by default in the legacy components of Microsoft Windows in English and some other Western languages
Tuve el mismo problema
UnicodeDecodeError
y lo resolví con esta línea. No sé si es la mejor manera, pero funcionó para mí.fuente
el primero, usando get_encoding_type para obtener el tipo de archivo de codificación:
el segundo, abriendo los archivos con el tipo:
fuente
Por si acaso alguien tiene el mismo problema. Estoy usando vim con YouCompleteMe , no pude iniciar ycmd con este mensaje de error, lo que hice fue:
export LC_CTYPE="en_US.UTF-8"
el problema desapareció.fuente
export LC_CTYPE="en_US.UTF-8"
?¿Qué puede hacer si necesita hacer un cambio en un archivo, pero no conoce 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 error de subrogación de escape:
fuente
He resuelto este problema simplemente agregando
fuente