Como detectar a codificação de um arquivo?

115

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

Quando abertos com o Notepad ++ , no menu "Codificação", alguns deles têm uma codificação de "UCS-2 Little Endian" e alguns de "UTF-8 sem BOM".

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

Marcel
fonte
7
Existe uma maneira bastante simples de usar o Firefox. Abra seu arquivo usando o Firefox e, em seguida, Exibir> Codificação de caracteres. Detalhado aqui .
Catherine Gasnier
use heurísticas. checkout encae chardetpara sistemas POSIX.
Janus Troelsen
3
Penso que uma resposta alternativa é TRIAL e ERRO. iconvem particular, é útil para esse fim. Essencialmente, você itera as seqüências de caracteres / texto corrompidos por diferentes codificações para ver qual delas funciona. Você ganha quando os personagens não estão mais corrompidos. Eu adoraria responder aqui, com um exemplo programático. Infelizmente, é uma questão protegida.
Brandon Bertelsen
O FF está usando o Mozilla Charset Detectors . Outra forma simples é abrir o arquivo com a palavra MS, ele vai adivinhar os arquivos muito corretamente mesmo para várias páginas de código chineses e japoneses antigos
phuclv
Se chardetou chardetectnão estiver disponível no seu sistema, você poderá instalar o pacote através do seu gerenciador de pacotes (por exemplo apt search chardet- no ubuntu / debian o pacote geralmente é chamado python-chardetou python3-chardet) ou via pip com pip install chardet(ou pip install cchardetpara a versão mais rápida e otimizada para c).
ccpizza 27/03

Respostas:

97

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 está realmente usando um arquivo .

Por exemplo, um arquivo com os três primeiros bytes provavelmente0xEF,0xBB,0xBF é um arquivo codificado em UTF-8. No entanto, pode ser um arquivo ISO-8859-1 que começa com os caracteres . Ou pode ser um tipo de arquivo completamente diferente.

O Notepad ++ faz o possível para adivinhar qual codificação um arquivo está usando e, na maioria das vezes, é correto. Às vezes, porém, ele se engana - é por isso que o menu 'Codificação' está lá, para que você possa substituir seu melhor palpite.

Para as duas codificações mencionadas:

  • Os arquivos "UCS-2 Little Endian" são arquivos UTF-16 (com base no que entendi nas informações aqui ), então provavelmente começam com 0xFF,0xFEos 2 primeiros bytes. Pelo que sei, o Notepad ++ os descreve como "UCS-2", pois não suporta certas facetas do UTF-16.
  • Os arquivos "UTF-8 sem BOM" não possuem bytes de cabeçalho. É isso que significa o bit "sem BOM".
vaughandroid
fonte
2
Por que um arquivo que inicia com uma lista técnica é detectado automaticamente como "UTF-8 sem lista técnica"?
Michael Borgwardt
2
E se um arquivo começou com 0xFF, 0xFE, ele deve ser detectado automaticamente como UTF-16, não UCS-2. O UCS-2 provavelmente é adivinhado porque contém principalmente caracteres ASCII e, portanto, todos os outros bytes são nulos.
22613 Michael Borgwardt
2
Com a experiência, infelizmente, os metadados ("cabeçalhos") também podem estar errados. O banco de dados que contém as informações pode estar corrompido ou o remetente original pode estar errado. (Este foi um problema significativo para nós nos últimos meses; alguns dados foram carregados como "UTF-8", exceto que era "realmente ISO8859-1, já que são realmente os mesmos ?!" Bah! Os cientistas devem ser mantidos longe de originação de metadados, pois eles só errar ...)
Donal Fellows
1
Na verdade, acho "engraçado" que o problema de codificação ainda permaneça em 2014, já que nenhum arquivo no mundo começará com "ï» ¿"e fico muito surpreso quando vejo uma página HTML carregada com a codificação errada. É uma questão de probabilidade. É impensável escolher a codificação errada, se outra codificação evitar caracteres estranhos. Procurar a codificação que evita caracteres estranhos funcionaria em 99,9999% dos casos, eu acho. Mas ainda existem erros .. Também é uma mensagem muito confuso para usar ascii em vez de UTF8 para economizar espaço .. é desenvolvedores junior confusas essa idéia de realizar ..
Revious
18

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 como metadados.

Caso contrário, tudo o que você pode fazer é um "palpite inteligente", mas o resultado geralmente é ambíguo, pois a mesma sequência de bytes pode ser válida em várias codificações.

Marco
fonte
2
OK, então, o sistema operacional Windows armazena essas informações (metadados) em algum lugar? No registro provavelmente?
Marcel
Você está errado. Isso é páginas de código - não exatamente o mesmo. Existem algoritmos para adivinhar a codificação Unicode.
23413 DeadMG
6
@ Marcel: Não. É por isso que "arquivos de texto" são tão problemáticos para qualquer coisa, exceto puro ASCII.
22613 Michael Borgwardt
bem notepad ++ pode fazer isso, ele pode dizer-lhe se o arquivo de texto é utf-8 codificado ou não
USER25