Trabajo a prueba de balas con encoding en Python.

La pregunta sobre Unicode en Python2.

Como sé sobre esto, siempre debería decode todo lo que leo desde afuera (archivos, red). decode convierte los bytes externos en cadenas internas de Python usando el conjunto de caracteres especificado en los parámetros. Por lo tanto, decode("utf8") significa que los bytes externos son una cadena Unicode y se decodificarán como cadenas de Python.

También siempre debería encode todo lo que escribo al exterior. Especifico la encoding en los parámetros de la función de encode y se convierte en la encoding y las escrituras adecuadas.

Estas afirmaciones son correctas, ¿verdad?

Pero a veces cuando analizo documentos html obtengo errores de deencoding. Como entiendo el documento en otra encoding (por ejemplo, cp1252 ), ocurre un error cuando bash descodificarlo utilizando la encoding utf8. ¿Entonces la pregunta es cómo escribir una aplicación a prueba de balas?

Descubrí que hay una buena biblioteca para adivinar que la encoding es Chardet y esta es la única forma de escribir aplicaciones a prueba de balas. ¿Derecha?

decode("utf8") significa que los bytes externos son una cadena Unicode y se decodificarán a cadenas de Python.

Estas afirmaciones son correctas, ¿verdad?

No, los bytes externos son datos binarios, no son una cadena Unicode. Entonces .decode("utf8") producirá un objeto unicode Python interpretando los bytes en como UTF-8; puede generar un error si los bytes no pueden decodificarse como UTF-8.

Determinar la encoding de cualquier documento dado no es necesariamente una tarea simple. O bien necesita tener alguna fuente externa de información que le indique la encoding, o necesita saber algo sobre lo que hay en el documento. Por ejemplo, si sabe que es un documento HTML con su encoding especificada internamente, puede analizar el documento utilizando un algoritmo como el que se describe en el Estándar HTML para encontrar la encoding y luego usar esa encoding para analizar el documento (es una operación de dos pases). Sin embargo, solo porque un documento HTML especifique una encoding, no significa que se pueda decodificar con esa encoding. Aún puede obtener errores si los datos están dañados o si el documento no se codificó correctamente en primer lugar.

Hay bibliotecas como Chardet (veo que ya lo mencionaste) que intentarán adivinar la encoding de un documento para ti (es solo una conjetura, no necesariamente correcta). Pero pueden tener sus propios problemas, como el rendimiento, y es posible que no reconozcan la encoding de su documento.

Intente ajustar sus funciones en try: excepto: llamadas.

  • Intenta decodificar como utf-8:
  • Captura de excepción si no es utf-8:
  • Si se levanta una excepción, intente la siguiente encoding:
  • etcétera etcétera…

Conviértalo en una función que devuelve str cuando (y si) encuentra una encoding que no fue exceptuada, y devuelve Ninguno o una str vacía cuando agota su lista de codificaciones y se genera la última excepción.

Como decían los demás, la encoding debería grabarse en algún lugar, así que compruebe eso primero.

Puede que no sea eficiente, y francamente debido a mi nivel de habilidad, puede estar muy lejos, pero para mi principiante, puede aliviar algunos de los problemas cuando se trata de encoding desconocida o no documentada.

Convertir a unicode desde cp437 . De esta manera obtienes tus bytes a unicode y viceversa.