Qual é o detector de codificação mais preciso?

Após determinada pesquisa, descobri que há alguns projetos de detecção de codificação no mundo java, se o getEncoding em InputStreamReader não funcionar:

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

No entanto, eu realmente não sei qual é o melhor entre todos. Alguém com experiência prática pode me dizer qual é o melhor em Java?

Eu verifiquei juniversalchardet e ICU4J em alguns arquivos CSV , e os resultados são inconsistentes: juniversalchardet teve melhores resultados:

  • UTF-8: ambos detectados.
  • Windows-1255: juniversalchardet detectou quando tinha letras hebraicas suficientes, o ICU4J ainda achava que era ISO-8859-1. Com ainda mais letras hebraicas, o ICU4J o detectou como ISO-8859-8, que é a outra codificação hebraica (e assim o texto estava OK).
  • SHIFT_JIS (japonês): juniversalchardet detectado e o ICU4J achou que era ISO-8859-2.
  • ISO-8859-1: detectado pelo ICU4J, não suportado pelo juniversalchardet.

Portanto, deve-se considerar quais codificações ele provavelmente terá que lidar. No final, escolhi o ICU4J .

Observe que o ICU4J ainda é mantido.

Note também que você pode querer usar o ICU4J, e caso ele retorne null porque não teve sucesso, tente usar o juniversalchardet. Ou o oposto.

O AutoDetectReader do Apache Tika faz exatamente isso – primeiro tenta usar o HtmlEncodingDetector, depois o UniversalEncodingDetector (que é baseado no juniversalchardet), e então tenta o Icu4jEncodingDetector (baseado no ICU4J).

Eu encontrei uma resposta online:

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

Diz algo vealuable aqui:

A força de um detector de codificação de caracteres reside no fato de seu foco estar ou não na análise estatística ou na descoberta de prótons HTML META e XML. Se você estiver processando arquivos HTML que possuem META, use cpdetector. Caso contrário, sua melhor aposta é monq.stuff.EncodingDetector ou com.sun.syndication.io.XmlReader.

Então é por isso que estou usando o cpdetector agora. Eu atualizarei a postagem com o resultado dela.

Eu pessoalmente usei o jchardet em nosso projeto (juniversalchardet não estava disponível naquela época) apenas para verificar se um stream era UTF-8 ou não.

Foi mais fácil integrar com o nosso aplicativo do que o outro e produziu ótimos resultados.