Pregunta

Mi programa tiene que leer los archivos que utilizan diferentes codificaciones. Pueden ser ANSI, UTF-8 o UTF-16 (endian grande o pequeña).

Cuando la lista de materiales (Byte Order Mark) está ahí, no tengo ningún problema. Sé que si el archivo es UTF-8 o UTF-16 BE o LE.

quería asumir cuando no había ninguna lista de materiales que el archivo fue ANSI. Pero he encontrado que los archivos que estoy tratando con frecuencia, están perdiendo su lista de materiales. Por lo tanto no hay lista de materiales puede significar que el archivo es ANSI, UTF-8, UTF-16 BE o LE.

Cuando la imagen no tiene una lista de materiales, ¿cuál sería la mejor manera de explorar algunos de los archivos y adivinar con mayor precisión el tipo de codificación? Me gustaría tener la razón cerca del 100% del tiempo si el archivo es ANSI y en el alto de 90 si se trata de un formato de codificación UTF.

Estoy buscando una manera algorítmica genérico para determinar esto. Pero utilizo realmente Delphi 2009, que sabe Unicode y tiene una clase TEncoding, así que algo específico para esa sería una ventaja.


Respuesta:

respuesta

de ShreevatsaR me llevó a buscar en Google de "codificación universal de detector de Delphi" que me sorprendió en tener este post que aparece en la posición # 1 después de haber estado vivo durante sólo unos 45 minutos! Es decir googlebotting rápida !! Y también sorprendente que Stackoverflow se mete en 1er lugar con tanta rapidez.

La segunda entrada de Google era una entrada de blog por Fred Eaker en href="http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html" detección codificación que los algoritmos enumerados en varios idiomas.

He encontrado la mención de Delphi en esa página, y me llevó directamente a el Detector ChsDet juego de caracteres gratuito Open Source en SourceForge escrito en Delphi y basado en el componente i18n de Mozilla.

fantástico! Gracias a todos los que respondieron (todo 1), gracias ShreevatsaR, y gracias de nuevo Stackoverflow, por ayudarme a encontrar mi respuesta en menos de una hora!

¿Fue útil?

Solución

Tal vez se puede pagar a un script en Python que utiliza Chardet: Detector de codificación universal . Es una reimplementación de la detección de codificación de caracteres que utiliza Firefox, y es utilizado por muchas aplicaciones diferentes . Enlaces útiles: de Mozilla código , trabajo de investigación se basa en (irónicamente, mi Firefox no puede detectar correctamente la codificación de esa página), < a href = "http://chardet.feedparser.org/docs/faq.html#faq.impossible" rel = "noreferrer"> breve explicación , detallada explicación .

Otros consejos

Aquí es cómo el bloc de notas que hace

También existe la href="http://chardet.feedparser.org/docs/faq.html#faq.what" rel="nofollow noreferrer"> pitón detector de codificación universal las cuales se puede comprobar.

Mi conjetura es:

  • En primer lugar, comprobar si el archivo tiene valores de byte menos de 32 (excepto TAB / saltos de línea). Si lo hace, no puede ser ANSI o UTF-8. Por lo tanto - UTF-16. Tan solo hay que averiguar el orden de bits. Para ello, debe utilizar probablemente alguna tabla de códigos de caracteres Unicode válidos. Si se encuentra con códigos inválidos, intente otro orden de bits si eso encaja. Si cualquiera de ajuste (o no hacer), comprobar cuál tiene mayor porcentaje de códigos alfanuméricos. También puede probar con searchung para saltos de línea y determinar endianness de ellos. Aparte de eso, no tengo idea de cómo comprobar si hay orden de bits.
  • Si el archivo no contiene valores de menos de 32 (aparte de dicho espacio en blanco), es probable que sea ANSI o UTF-8. Trate de analizarlo como UTF-8 y ver si le da ningún caracteres Unicode no válidos. Si lo hace, es probable que sea ANSI.
  • Si esperas documentos en Inglés no solo byte o de varios bytes codificaciones no Unicode, entonces estás de suerte. Lo mejor que puede hacer es algo como Internet Explorer que hace un histograma de valores de carácter y lo compara con los histogramas de las lenguas conocidas. Funciona bastante a menudo, pero a veces falla también. Y usted tiene que tener una gran biblioteca de histogramas de letras para cada idioma.

ASCII? Sin OS moderna utiliza ASCII más. Todos ellos utilizan 8 códigos de bits, al menos, lo que significa que es UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS o cualquier otra cosa es que hay.

La única prueba que conozco es para comprobar si no válidos UTF-8 caracteres. Si encuentra alguna, entonces usted sabe que no puede ser UTF-8. Lo mismo es probable que sea posible para UTF-16. Pero cuando es ningún conjunto Unicode, entonces va a ser difícil saber qué página de códigos de Windows que podría ser.

La mayoría de los editores que conozco lidiar con esto al permitir que el usuario elija un valor predeterminado de la lista de todas las codificaciones posibles.

No es el código que hay para comprobar la validez de caracteres UTF.

scroll top