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 ++?


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".


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.