Como detectar a codificação de um arquivo?

102

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

Quando aberto com o Notepad ++ , no menu "Codificação", 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 parecem ser scripts perfeitamente válidos. Como eu poderia dizer quais codificações o arquivo tem sem o Notepad ++?

    
por Marcel 15.02.2013 / 10:45
fonte

2 respostas

87

Os arquivos geralmente indicam sua codificação com um cabeçalho de arquivo. Existem muitos exemplos aqui . No entanto, mesmo lendo o cabeçalho você nunca pode ter certeza de qual codificação um arquivo está realmente usando .

Por exemplo, um arquivo com os primeiros três bytes 0xEF,0xBB,0xBF é provavelmente um arquivo codificado em UTF-8. No entanto, pode ser um arquivo ISO-8859-1 que comece com os caracteres  . Ou pode ser um tipo de arquivo totalmente diferente.

O Notepad ++ faz o possível para adivinhar qual codificação um arquivo está usando e, na maioria das vezes, acerta. Às vezes, é errado - é por isso que o menu 'Encoding' está lá, então você pode substituir seu melhor palpite.

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

  • Os arquivos "UCS-2 Little Endian" são arquivos UTF-16 (com base no que eu entendi da informação aqui ) então provavelmente começa com 0xFF,0xFE como os primeiros 2 bytes. Pelo que eu posso dizer, o Notepad ++ os descreve como "UCS-2", uma vez que não suporta certas facetas do UTF-16.
  • Os arquivos "UTF-8 sem BOM" não possuem bytes de cabeçalho. Isso é o que significa o bit "sem BOM".
por 15.02.2013 / 11:16
fonte
15

Você não pode. Se você pudesse fazer isso, não haveria tantos sites ou arquivos de texto com “rabiscos aleatórios” por aí. É por isso que a codificação é geralmente enviada junto com a carga útil como metadados.

Caso não seja, tudo que você pode fazer é um "palpite inteligente", mas o resultado é geralmente ambíguo, já que a mesma seqüência de bytes pode ser válida em várias codificações.

    
por 15.02.2013 / 11:16
fonte