Algoritmo de Detecção de Codificação de Caracteres

Eu estou procurando uma maneira de detectar conjuntos de caracteres dentro de documentos. Eu tenho lido a implementação da detecção de conjunto de caracteres do Mozilla aqui:

Detecção Universal Charset

Eu também encontrei uma implementação Java deste chamado jCharDet:

JCharDet

Ambos são baseados em pesquisas realizadas usando um dataset estáticos. O que eu estou querendo saber é se alguém usou qualquer outra implementação com sucesso e, em caso afirmativo, o que? Você rolou sua própria abordagem e, em caso afirmativo, qual foi o algoritmo usado para detectar o conjunto de caracteres?

Qualquer ajuda seria apreciada. Eu não estou procurando uma lista de abordagens existentes via Google, nem estou procurando um link para o artigo de Joel Spolsky – apenas para esclarecer:)

UPDATE: Eu fiz um monte de pesquisas sobre isso e acabei encontrando um framework chamado cpdetector que usa uma abordagem plugável para detecção de caracteres, veja:

CPDetector

Isso fornece BOM, chardet (abordagem Mozilla) e plugins de detecção ASCII. Também é muito fácil escrever o seu próprio. Há também outro framework, que oferece uma detecção de caracteres muito melhor que a abordagem Mozilla / jchardet etc …

ICU4J

É muito fácil escrever seu próprio plugin para o cpdetector que usa essa estrutura para fornecer um algoritmo de detecção de codificação de caracteres mais preciso. Funciona melhor que a abordagem do Mozilla.

Anos atrás, nós tínhamos a detecção de conjunto de caracteres para um aplicativo de e-mail e nós rodamos o nosso próprio. O aplicativo de e-mail era na verdade um aplicativo WAP e o telefone esperava o UTF-8. Houve várias etapas:

Universal

Poderíamos facilmente detectar se o texto era UTF-8, pois há um padrão de bit específico nos bits superiores de bytes 2/3 / etc. Uma vez que você encontrou aquele padrão repetido um certo número de vezes, você poderia ter certeza de que era o UTF-8.

Se o arquivo começar com uma marca de ordem de byte UTF-16, provavelmente você pode assumir que o restante do texto é essa codificação. Caso contrário, detectar o UTF-16 não é tão fácil quanto o UTF-8, a menos que você possa detectar o padrão de pares substitutos: mas o uso de pares substitutos é raro, de modo que geralmente não funciona. O UTF-32 é semelhante, exceto que não há pares substitutos para detectar.

Detecção regional

Em seguida, assumiríamos que o leitor estava em uma determinada região. Por exemplo, se o usuário estava vendo a interface do usuário localizada em japonês, poderíamos então tentar detectar as três principais codificações japonesas. O ISO-2022-JP está de novo a leste para detectar as seqüências de escape. Se isso falhar, determinar a diferença entre o EUC-JP e o Shift-JIS não é tão simples. É mais provável que um usuário receba o texto Shift-JIS, mas havia caracteres no EUC-JP que não existiam no Shift-JIS, e vice-versa, então às vezes você conseguia uma boa correspondência.

O mesmo procedimento foi usado para codificações chinesas e outras regiões.

Escolha do usuário

Se estes não fornecerem resultados satisfatórios, o usuário deve escolher manualmente uma codificação.

Não exatamente o que você pediu, mas notei que o projeto ICU inclui uma class CharsetDetector .