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 ++?
enca
echardet
para sistemas POSIX.iconv
em 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.chardet
ouchardetect
não estiver disponível no seu sistema, você poderá instalar o pacote através do seu gerenciador de pacotes (por exemploapt search chardet
- no ubuntu / debian o pacote geralmente é chamadopython-chardet
oupython3-chardet
) ou via pip compip install chardet
(oupip install cchardet
para a versão mais rápida e otimizada para c).Respostas:
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 provavelmente
0xEF,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:
0xFF,0xFE
os 2 primeiros bytes. Pelo que sei, o Notepad ++ os descreve como "UCS-2", pois não suporta certas facetas do UTF-16.fonte
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.
fonte