¿Existe una función de biblioteca de Python que intenta adivinar la codificación de caracteres de algunos bytes? [duplicar]
-
06-07-2019 - |
Pregunta
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo determinar la codificación del texto? 9 respuestas
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".
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.
Puede que le interese Detector de codificación universal .
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