Autodetección de encodings
He estado buscando un poco en la web sobre el tema... La idea es detectar el encoding sin hacer uso de información existente en declaraciones (del protocolo, lenguaje, ...).
En C++ existe el detector de Mozilla: Mozilla Charset Detectors. (a través de Koders, podemos ver la rama)
En python he encontrado el Universal Encoding Detector. Aquí se explica como funciona (la doc). La librería es un port de la de Mozilla, la cual a su vez se implementó basandose en este articulo: A composite approach to language/encoding detection.
¿Lo que parece que no detecta es ISO-8859-1? Que raro.... (al menos no lo menciona en la documentación).
Antes de encontrar lo que ya he mencionado encontré el siguiente codigo (usando koders):
Y ya para acabar, unos links:
En C++ existe el detector de Mozilla: Mozilla Charset Detectors. (a través de Koders, podemos ver la rama)
En python he encontrado el Universal Encoding Detector. Aquí se explica como funciona (la doc). La librería es un port de la de Mozilla, la cual a su vez se implementó basandose en este articulo: A composite approach to language/encoding detection.
¿Lo que parece que no detecta es ISO-8859-1? Que raro.... (al menos no lo menciona en la documentación).
Antes de encontrar lo que ya he mencionado encontré el siguiente codigo (usando koders):
def autodetect_encoding(self, new_data):
enc = ""
if len(new_data)<5:
# If this is a very short external entity, it may not
# have enough bytes for auto-detection. In that case,
# it must be UTF-8
enc = "utf-8"
elif new_data[:3] == '\xef\xbb\xbf':
enc = "utf-8" # with BOM
elif new_data[:4] == '\0\0\0\x3c':
enc = "ucs-4-be"
elif new_data[:4] == '\x3c\0\0\0':
enc = "ucs-4-le"
# ignore unusual byte orders 2143 and 3412
elif new_data[:2] == '\xfe\xff':
enc = "utf-16-be" # with BOM
elif new_data[:2] == '\xff\xfe':
enc = "utf-16-le" # with BOM
elif new_data[:4] == '\0\x3c\0\x3f':
enc = "utf-16-be"
elif new_data[:4] == '\0\x3f\0\x3c':
enc = "utf-16-be"
elif new_data[:5] == ' # need to wait for encoding attribute, do not try
# to apply a codec until then.
pass
# ignore EBCDIC
else:
# Does not start with enc = "utf-8"
return enc
Y ya para acabar, unos links:
- Un thread sobre encoding y BOM (Byte Order Mark)
- Esta pagina parece de lectura recomendada.
- Character Encoding Detection en el Universal Feed Parser (en python).
- HTML::Encoding (perl)
No hay comentarios:
Publicar un comentario