2011-07-15 17 views
27

¿Hay algún método universal para detectar string charset? Utilizo etiquetas IPTC y no tengo codificación conocida. Necesito detectarlo y luego cambiarlos a utf-8.Python - detectar charset y convertir a utf-8

Cualquiera puede ayudar?

+0

En cuanto a su comentario a @Ignacio, me gustaría invitarle a pegar un par de ejemplos de cadena "Ninguno" en su pregunta, para que podamos jugar con ellos y entender cuál es el problema. Sería útil si también pudiera pegar su versión decodificada correcta como se hace en el portal que mencionó. – mac

Respuesta

31

que desea utilizar chardet, un detector de codificación

+2

No funciona, lo trierd antes de preguntar aquí. Algunas cadenas obtienen codificación None pero no es verdad. Las etiquetas están codificadas de alguna manera porque en 1 portal web son reconocidas. – robos85

+0

+1: chardet parece ser una de las mejores formas actuales de hacer la detección de codificación. @ robos85: No es posible hacer una detección de codificación perfecta: http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-file/ 436299 # 436299. – EOL

+1

He desarrollado una forma mucho más exitosa de detectar la codificación, basada en conocer el idioma. Obtiene las codificaciones de 8 bits correctas. Finalmente. – tchrist

13

Es un poco tarde, pero también hay otra solución: intentar utilizar pyicu.

Un ejemplo:

import icu 
def convert_encoding(data, new_coding='UTF-8'): 
    coding = icu.CharsetDetector(data).detect().getName() 
    if new_coding.upper() != coding.upper(): 
     data = unicode(data, coding).encode(new_coding) 
    return data 
+0

pyicu basado en icu, y algunas veces detectará errores de alguna codificación: http://sourceforge.net/p/icu/mailman/icu-design/thread/[email protected]com/ – coanor

+5

@coanor: * cualquier detector de codificación fallará en algunos casos, ya que no hay forma de determinar con precisión la codificación de todas las pruebas – MestreLion

2

Hay otro módulo llamado cchardet

Se dice que es más rápido que Chardet.

Tenga en cuenta que se requiere Cython

11

Si quiere hacerlo con cchardet, puede utilizar esta función.

import cchardet 
def convert_encoding(data, new_coding = 'UTF-8'): 
    encoding = cchardet.detect(data)['encoding'] 

    if new_coding.upper() != encoding.upper(): 
    data = data.decode(encoding, data).encode(new_coding) 

    return data