Detectar a codificação UTF-8 (como o MS IDE faz isso)?

Um problema com várias codificações de caracteres é que o arquivo que o contém nem sempre é claramente marcado. Existem convenções inconsistentes para marcar algumas usando "marcadores de ordem de byte" ou BOMs. Mas na essência você tem que sercontou qual é a codificação do arquivo, para lê-lo com precisão.

Nós construímos ferramentas de programação que lêem arquivos fonte, e isso nos dá tristeza. Temos meios para especificar padrões, e farejar para BOMs, etc. E nos damos muito bem com convenções e padrões. Mas um lugar em que nós (e eu suponho que todos os outros) ficam desligados são arquivos UTF-8 que não são marcados pelo BOM.

Os IDEs recentes do MS (por exemplo, o VS Studio 2010) aparentemente "detectam" um arquivo para determinar se ele é codificado em UTF-8 sem um BOM. (Estar no negócio de ferramentas, gostaríamos de ser compatíveis com MS por causa de sua participação de mercado, mesmo que isso signifique ter que passar por cima do penhasco "estúpido" com eles.) Estou especificamente interessado no que eles usam como um heurística (embora as discussões sobre heurística sejam boas)? Como pode ser "certo"? (Considere uma string codificada ISO8859-x interpretada dessa maneira).

EDIT: Este trabalho sobre a detecção de codificações de caracteres / conjuntos é bastante interessante:http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

EDITAR Dezembro de 2012: terminamos a verificação do arquivo inteiro para ver se ele continha violações das sequências UTF-8 ... e, se isso não ocorrer, chamamos de UTF-8. A parte ruim desta solução é que você tem que processar os caracteres duas vezes, se for UTF-8. (Se não for UTF-8, este teste provavelmente determinará isso rapidamente, a menos que o arquivo aconteça com todo o ASCII de 7 bits, no qual a leitura como UTF-8 não irá prejudicar).

questionAnswers(2)

yourAnswerToTheQuestion