¿Existe una función de biblioteca de Python que intenta adivinar la codificación de caracteres de algunos bytes? [duplicar]

StackOverflow https://stackoverflow.com/questions/269060

Pregunta

    

Esta pregunta ya tiene una respuesta aquí:

         

Estoy escribiendo un software de procesamiento de correo en Python que encuentra bytes extraños en los campos de encabezado. Sospecho que esto es solo correo malformado; el mensaje en sí dice ser us-ascii, por lo que no creo que haya una codificación verdadera, pero me gustaría obtener una cadena unicode que se aproxime a la original sin arrojar un UnicodeDecodeError .

Entonces, estoy buscando una función que tome un str y opcionalmente algunos consejos y haga todo lo posible para devolverme un unicode . Podría escribir uno, por supuesto, pero si existe tal función, su autor probablemente haya pensado un poco más sobre la mejor manera de hacerlo.

También sé que el diseño de Python prefiere explícito a implícito y que la biblioteca estándar está diseñada para evitar la magia implícita en la decodificación de texto. Solo quiero decir explícitamente "adelante y adivina".

¿Fue útil?

Solución 3

Hasta donde puedo decir, la biblioteca estándar no tiene una función, aunque no es demasiado difícil escribir una como se sugirió anteriormente. Creo que lo que estaba buscando era una forma de decodificar una cadena y garantizar que no arrojaría una excepción. El parámetro de errores para string.decode lo hace.

def decode(s, encodings=('ascii', 'utf8', 'latin1')):
    for encoding in encodings:
        try:
            return s.decode(encoding)
        except UnicodeDecodeError:
            pass
    return s.decode('ascii', 'ignore')

Otros consejos

+1 para el chardet módulo (sugerido por @insin ).

No está en la biblioteca estándar, pero puede instalarlo fácilmente con el siguiente comando:

$ pip install chardet

Ejemplo :

>>> import chardet
>>> import urllib
>>> detect = lambda url: chardet.detect(urllib.urlopen(url).read())
>>> detect('http://stackoverflow.com')
{'confidence': 0.85663169917190185, 'encoding': 'ISO-8859-2'}    
>>> detect('https://stackoverflow.com/questions/269060/is-there-a-python-lib')
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

Consulte Instalando Pip si no tiene uno.

La mejor manera de hacer esto que he encontrado es intentar iterativamente decodificar un prospectivo con cada una de las codificaciones más comunes dentro de un bloque try excepto

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top