¿Cuál es el detector de encoding más preciso?

Después de cierta encuesta, descubro que hay algunos proyectos de detección de encoding en Java World, si el getEncoding en InputStreamReader no funciona:

  1. juniversalchardet
  2. jchardet
  3. cpdetector
  4. ICU4J

Sin embargo, realmente no sé cuál es el mejor entre todos. ¿Alguien con experiencia práctica puede decirme cuál es el mejor en Java?

He revisado juniversalchardet e ICU4J en algunos archivos CSV , y los resultados son inconsistentes: juniversalchardet tuvo mejores resultados:

  • UTF-8: ambos detectados.
  • Windows-1255: juniversalchardet detectado cuando tenía suficientes letras hebreas, ICU4J aún pensaba que era ISO-8859-1. Con aún más letras hebreas, ICU4J lo detectó como ISO-8859-8, que es la otra encoding hebrea (por lo que el texto estaba bien).
  • SHIFT_JIS (japonés): se detectó el juniversalchardet e ICU4J pensó que era ISO-8859-2.
  • ISO-8859-1: detectado por ICU4J, no admitido por juniversalchardet.

Entonces, uno debería considerar qué codificaciones va a tener que tratar. Al final elegí ICU4J .

Observe que ICU4J todavía se mantiene.

También tenga en cuenta que es posible que desee utilizar ICU4J, y en caso de que devuelva nulo porque no tuvo éxito, intente utilizar juniversalchardet. O lo opuesto.

AutoDetectReader de Apache Tika hace exactamente esto: primero intenta usar HtmlEncodingDetector, luego UniversalEncodingDetector (que se basa en juniversalchardet), y luego prueba Icu4jEncodingDetector (basado en ICU4J).

Encontré una respuesta en línea:

http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

Dice algo muy valioso aquí:

La fuerza de un detector de encoding de caracteres radica en si su foco está en el análisis estadístico o en el descubrimiento de prólogos HTML META y XML. Si está procesando archivos HTML que tienen META, use cpdetector. De lo contrario, su mejor opción es monq.stuff.EncodingDetector o com.sun.syndication.io.XmlReader.

Entonces es por eso que estoy usando cpdetector ahora. Actualizaré la publicación con el resultado.

Personalmente he usado jchardet en nuestro proyecto (juniversalchardet no estaba disponible en ese momento) solo para verificar si una transmisión era UTF-8 o no.

Fue más fácil de integrar con nuestra aplicación que la otra y arrojó excelentes resultados.