Algoritmo de detección de encoding de caracteres

Estoy buscando una manera de detectar conjuntos de caracteres dentro de los documentos. He estado leyendo la implementación de detección de conjuntos de caracteres de Mozilla aquí:

Detección universal de caracteres

También encontré una implementación de Java llamada jCharDet:

JCharDet

Ambos se basan en investigaciones llevadas a cabo utilizando un conjunto de datos estáticos. Lo que me pregunto es si alguien ha utilizado alguna otra implementación con éxito y, en caso afirmativo, ¿qué? ¿Hiciste rodar tu propio enfoque y, de ser así, cuál fue el algoritmo que usaste para detectar el conjunto de caracteres?

Cualquier ayuda sería apreciada. No estoy buscando una lista de enfoques existentes a través de Google, ni estoy buscando un enlace al artículo de Joel Spolsky, solo para aclarar:)

ACTUALIZACIÓN: Hice un montón de investigación sobre esto y terminé encontrando un marco llamado cpdetector que utiliza un enfoque conectable para la detección de caracteres, ver:

CPDetector

Esto proporciona BOM, chardet (aproximación Mozilla) y complementos de detección ASCII. También es muy fácil escribir el tuyo. También hay otro marco, que proporciona una detección de caracteres mucho mejor que el enfoque de Mozilla / jchardet, etc.

ICU4J

Es bastante fácil escribir su propio complemento para cpdetector que utiliza este marco para proporcionar un algoritmo de detección de encoding de caracteres más preciso. Funciona mejor que el enfoque de Mozilla.

Hace años teníamos detección de conjunto de caracteres para una aplicación de correo, y lanzamos la nuestra. La aplicación de correo era en realidad una aplicación WAP, y el teléfono esperaba UTF-8. Hubo varios pasos:

Universal

Podríamos detectar fácilmente si el texto era UTF-8, ya que hay un patrón de bits específico en los bits superiores de los bytes 2/3 / etc. Una vez que haya encontrado ese patrón repetido una cierta cantidad de veces, puede estar seguro de que fue UTF-8.

Si el archivo comienza con una marca de orden de bytes UTF-16, probablemente pueda suponer que el rest del texto es esa encoding. De lo contrario, detectar UTF-16 no es tan fácil como UTF-8, a menos que pueda detectar el patrón de pares sustitutos: pero el uso de pares sustitutos es raro, por lo que no suele funcionar. UTF-32 es similar, excepto que no hay pares sustitutos para detectar.

Detección regional

Luego, supondríamos que el lector estaba en cierta región. Por ejemplo, si el usuario estaba viendo la IU localizada en japonés, podríamos intentar la detección de las tres principales codificaciones japonesas. ISO-2022-JP está nuevamente al este para detectar con las secuencias de escape. Si eso falla, determinar la diferencia entre EUC-JP y Shift-JIS no es tan sencillo. Es más probable que un usuario reciba texto de Shift-JIS, pero había caracteres en EUC-JP que no existían en Shift-JIS, y viceversa, por lo que a veces puede obtener una buena coincidencia.

El mismo procedimiento se usó para codificaciones chinas y otras regiones.

Elección del usuario

Si estos no proporcionan resultados satisfactorios, el usuario debe elegir manualmente una encoding.

No es exactamente lo que pediste, pero noté que el proyecto ICU incluye una clase CharteetDetector .