2009-04-21 26 views
43

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

Universal Charset Detection

También he encontrado una implementación Java de esta llamada jCharDet:

JCharDet

Ambos se basan en investigación llevada 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 para obtener una lista de los enfoques existentes a través de Google, ni estoy en busca de un enlace al artículo de Joel Spolsky - sólo para aclarar:)

ACTUALIZACIÓN: Hice un montón de investigación sobre este y terminó encontrando un marco llamado cpdetector que utiliza un enfoque conectable a la detección de caracteres, consulte:

CPDetector

Esto proporciona la lista de materiales, Chardet (enfoque de Mozilla) y los plugins de detección ASCII. También es muy fácil escribir el tuyo. También hay otro marco, que ofrece mucho mejor detección del carácter que el enfoque Mozilla/jchardet etc ...

ICU4J

Es bastante fácil de escribir su propio blog a más de cpdetector que utiliza este marco para proporcionar un carácter más preciso algoritmo de detección de codificación. Funciona mejor que el enfoque de Mozilla.

+0

Es un problema difícil. Gracias por los excelentes enlaces de su propia investigación. – erickson

+0

Hay un caso famoso de esto: http://blogs.msdn.com/oldnewthing/archive/2007/04/17/2158334.aspx – McDowell

+0

Sí, superado el problema de la libreta, voy a revisar mi publicación con mi investigación una vez que haya terminado y completado, algunas cosas interesantes ... – Jon

Respuesta

9

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

hemos podido detectar fácilmente si el texto era UTF-8, ya que existe 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 resto del texto es esa codificación. 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

Siguiente supondríamos que el lector se encontraba en una región determinada. 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 utilizó para las codificaciones chinas y otras regiones.

elección del usuario

Si éstos no proporcionan resultados satisfactorios, el usuario debe elegir manualmente una codificación.

+0

Supongo que los sistemas a los que hace referencia en los enlaces utilizo estrategias similares a las que describí, pero espero que compartir nuestra experiencia sea útil. –

+3

UTF-32 es muy fácil de detectar, debido a la restricción en el rango del punto de código. Una unidad de código UTF-32 válida siempre se ajustará al patrón 00 {0x | 10} xx xx (para BE) o xx xx {0x | 10} 00 (para LE). – dan04

+0

@JaredOberhaus ¿podría mostrar algún código de Java sobre el primer paso? Además, ¿cómo encontraría los elementos del grupo correcto de codificaciones para el segundo paso? –

Cuestiones relacionadas