Como detectar a codificação de um arquivo?

No meu sistema de arquivos (Windows 7) eu tenho alguns arquivos de texto (Estes são arquivos de script SQL, se isso importa).

Quando aberto com Notepad++, no "Encoding" menu alguns deles são reportados como tendo uma codificação de "UCS-2 Little Endian" e alguns de "UTF-8 sem BOM".

Qual é a diferença aqui? Todos eles parecem ser roteiros perfeitamente válidos. Como eu poderia dizer quais codificações o arquivo tem sem o Notepad++?

Solução

Os ficheiros geralmente indicam a sua codificação com um cabeçalho de ficheiro. Há muitos exemplos aqui. No entanto, mesmo lendo o cabeçalho você nunca pode ter certeza do que está realmente usando.

Por exemplo, um arquivo com os três primeiros bytes 0xEF,0xBBB,0xBF é provavelmente um arquivo codificado em UTF-8. Entretanto, pode ser um arquivo ISO-8859-1 que por acaso começa com os caracteres . Ou pode ser um tipo de arquivo totalmente diferente.

O Notepad++ faz o seu melhor para adivinhar o que codifica um ficheiro, e na maioria das vezes acerta. Mas às vezes ele erra - isso's porque isso 'Encoding' menu está lá, para que você possa anular o seu melhor palpite.

Para as duas codificações que você menciona:

  • O "UCS-2 Little Endian" arquivos são arquivos UTF-16 (baseado no que eu entendi da informação aqui) então provavelmente começam com 0xFF,0xFE como os primeiros 2 bytes. Pelo que posso dizer, Notepad++ descreve-os como "UCS-2" uma vez que não suporta't certas facetas do UTF-16.
  • O "UTF-8 sem BOM" arquivos don'não tem nenhum byte de cabeçalho. Isso'é o que o "sem BOM" bit significa.
Comentários (10)

Não pode. Se você pudesse fazer isso, não haveria tantos sites ou arquivos de texto com "algaraviadas aleatórias" por aí. Essa's é a razão pela qual a codificação é normalmente enviada junto com a carga útil como meta dados.

Caso não seja's, tudo que você pode fazer é um "palpite inteligente", mas o resultado é muitas vezes ambíguo uma vez que a mesma sequência de bytes pode ser válida em várias codificações.

Comentários (4)