Pergunta

Meu programa tem de ler arquivos que usam várias codificações. Eles podem ser ANSI, UTF-8 ou UTF-16 (grande ou pequeno endian).

Quando o BOM (Byte Order Mark) está lá, não tenho nenhum problema. Eu sei que se o arquivo é UTF-8 ou UTF-16 BE ou LE.

Eu queria assumir quando não havia BOM que o arquivo foi ANSI. Mas eu descobri que os arquivos que eu estou lidando com muitas vezes estão faltando sua BOM. Portanto, nenhum BOM pode significar que o arquivo é ANSI, UTF-8, UTF-16 BE ou LE.

Quando o arquivo não tem BOM, qual seria a melhor forma de digitalizar alguns dos arquivos e acho que com mais precisão o tipo de codificação? Eu gostaria de estar certo perto de 100% do tempo se o arquivo é ANSI e no 90 de se é um formato UTF.

Eu estou procurando uma maneira algorítmica genérico para determinar isso. Mas eu realmente usar Delphi 2009 que conhece Unicode e tem uma classe TEncoding, então algo específico para isso seria um bônus.


Resposta:

A resposta de ShreevatsaR me levou a pesquisar no Google por "codificação universal detector delphi" o que me surpreendeu em ter este post listado na posição # 1 depois de estar vivo por apenas cerca de 45 minutos! Isso está rapidamente googlebotting !! E também surpreendente que Stackoverflow fica em 1º lugar tão rapidamente.

A segunda entrada no Google era uma entrada de blog por Fred Eaker em href="http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html" codificação de detecção que os algoritmos listados em vários idiomas.

Eu encontrei a menção de Delphi nessa página, e isso me levou direto para de Livre OpenSource ChsDet Charset Detector no SourceForge escrito em Delphi e com base na componente i18n da Mozilla.

Fantástico! Obrigado a todos aqueles que responderam (todos +1), obrigado ShreevatsaR, e obrigado novamente Stackoverflow, por me ajudar a encontrar a minha resposta em menos de uma hora!

Foi útil?

Solução

Talvez você possa desembolsar para um script Python que usos Chardet: Universal Encoding Detector . É um reimplementation da detecção de codificação de caracteres que utilizado pelo Firefox, e é utilizado por muitas aplicações diferentes . Links úteis: da Mozilla código , trabalho de pesquisa foi baseado (ironicamente, meu Firefox não consegue detectar corretamente a codificação da página), < a href = "http://chardet.feedparser.org/docs/faq.html#faq.impossible" rel = "noreferrer"> breve explicação , detalhada explicação .

Outras dicas

Aqui está como bloco de notas faz isso

Há também a python Universal Encoding Detector qual você pode verificar.

Meu palpite é:

  • Em primeiro lugar, verifique se o arquivo tem valores de byte inferior a 32 (exceto para guia / newlines). Se isso acontecer, ele não pode ser ANSI ou UTF-8. Assim - UTF-16. Só tem que descobrir a ordenação. Para isso, você provavelmente deve usar alguma tabela de códigos de caracteres Unicode válidos. Se você encontrar códigos inválidos, tente o outro endianness se que se encaixa. Se qualquer ajuste (ou não), verificação de qual deles tem maior porcentagem de códigos alfanuméricos. Além disso, você pode tentar searchung para quebras de linha e determinar endianness deles. Fora isso, eu não tenho idéia de como verificar se há endianness.
  • Se o arquivo não contém valores inferiores a 32 (para além da referida espaços em branco), é provavelmente ANSI ou UTF-8. Tente analisá-lo como UTF-8 e veja se você receber quaisquer caracteres Unicode inválidos. Se o fizer, provavelmente é ANSI.
  • Se você espera que os documentos não-Inglês de byte único ou multi-byte codificações não-Unicode, então você está fora de sorte. Melhor coisa que você pode fazer é algo como Internet Explorer que faz um histograma de valores de caracteres e compara com os histogramas de línguas conhecidas. Ele funciona muito frequentemente, mas às vezes falha também. E você tem que ter uma grande biblioteca de carta histogramas para cada idioma.

ASCII? No moderno usos OS ASCII mais. Eles todos os códigos de uso 8 bits, pelo menos, o que significa que é UTF-8, ISOLatinX, WinLatinX, MacRoman, Shift-JIS ou qualquer outra coisa que está lá fora.

O único teste que eu conheço é para verificar se há inválidos UTF-8 caracteres. Se você encontrar algum, então você sabe que não pode ser UTF-8. Mesmo é provavelmente possível para UTF-16. Mas quando é nenhum conjunto Unicode, então vai ser difícil dizer qual página de código do Windows que poderia ser.

A maioria dos editores que conheço lidar com isso, permitindo que o usuário escolher um padrão da lista de todas as codificações possíveis.

Há código lá fora, para verificar a validade de caracteres UTF.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top