¿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?
¿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?
que desea utilizar chardet
, un detector de codificación
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
+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
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
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
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
@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
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
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