Como posso testar a codificação de um arquivo de texto… É válido e o que é?

36

Eu tenho vários arquivos .htm que abrem no Gedit sem nenhum aviso / erro, mas quando abro esse mesmo arquivo em Jedit , ele me avisa sobre codificação UTF-8 inválida ...

A meta tag html indica "charset = ISO-8859-1"
Jedit permite uma Lista de codificações de fallback e uma Lista de codificadores de auto-detectores (atualmente "BOM XML-PI"), então meu problema imediato foi resolvido. mas isso me fez pensar: "E se os metadados não estivessem lá?"

Quando as informações de codificação não estão disponíveis, existe um programa CLI que possa fazer uma "melhor estimativa" de quais codificações podem ser aplicadas?

E, embora seja uma questão ligeiramente diferente; Existe um programa CLI que testa a validade de uma codificação conhecida ?

    
por Peter.O 19.04.2011 / 09:16

2 respostas

48

O comando file faz "best-guess" sobre a codificação. Use o parâmetro -i para forçar file a imprimir informações sobre a codificação.

Demonstração:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

Veja como eu criei os arquivos:

$ echo ä > umlaut-utf8.txt 

Hoje em dia tudo é utf-8. Mas convença-se:

$ hexdump -C umlaut-utf8.txt 
00000000  c3 a4 0a                                          |...|
00000003

Compare com o link

Converta para as outras codificações:

$ iconv -f utf8 -t iso88591 umlaut-utf8.txt > umlaut-iso88591.txt 
$ iconv -f utf8 -t utf16 umlaut-utf8.txt > umlaut-utf16.txt 

Verifique o despejo hexadecimal:

$ hexdump -C umlaut-iso88591.txt 
00000000  e4 0a                                             |..|
00000002
$ hexdump -C umlaut-utf16.txt 
00000000  ff fe e4 00 0a 00                                 |......|
00000006

Crie algo "inválido" misturando todos os três:

$ cat umlaut-iso88591.txt umlaut-utf8.txt umlaut-utf16.txt > umlaut-mixed.txt 

Qual file diz:

$ file -i *
umlaut-iso88591.txt: text/plain; charset=iso-8859-1
umlaut-mixed.txt:    application/octet-stream; charset=binary
umlaut-utf16.txt:    text/plain; charset=utf-16le
umlaut-utf8.txt:     text/plain; charset=utf-8

sem -i :

$ file *
umlaut-iso88591.txt: ISO-8859 text
umlaut-mixed.txt:    data
umlaut-utf16.txt:    Little-endian UTF-16 Unicode text, with no line terminators
umlaut-utf8.txt:     UTF-8 Unicode text

O comando file não faz ideia de "válido" ou "inválido". Ele apenas vê alguns bytes e tenta adivinhar o que a codificação pode ser. Como humanos, podemos reconhecer que um arquivo é um arquivo de texto com alguns tremas em uma codificação "errada". Mas, como computador, precisaria de algum tipo de inteligência artificial.

Alguém poderia argumentar que a heurística de file é algum tipo de inteligência artificial. No entanto, mesmo que seja, é muito limitado.

Veja mais informações sobre o comando file : link

    
por 19.04.2011 / 09:35
19

Nem sempre é possível descobrir com certeza qual é a codificação de um arquivo de texto. Por exemplo, a seqüência de bytes 35 ( c3 bd em hexadecimal) poderia ser ý em UTF-8 ou ý em latin1 ou Ă˝ em latin2 ou em BIG-5 e assim por diante.

Algumas codificações têm sequências de bytes inválidas, por isso é possível descartá-las com certeza. Isto é verdade em particular do UTF-8; a maioria dos textos na maioria das codificações de 8 bits não é válida UTF-8. Você pode testar o UTF-8 válido com isutf8 de moreutils ou com iconv -f utf-8 -t utf-8 >/dev/null , entre outros. / p>

Existem ferramentas que tentam adivinhar a codificação de um arquivo de texto. Eles podem cometer erros, mas eles costumam trabalhar na prática, desde que você não tente enganá-los deliberadamente.

  • file
  • Perl Encode::Guess (parte da distribuição padrão) tenta sucessivas codificações em uma cadeia de bytes e retorna a primeira codificação em que a string é um texto válido.
  • Enca é um adivinhador e conversor de codificação. Você pode dar a ela um nome de idioma e um texto que presume estar nessa língua (os idiomas suportados são principalmente idiomas do leste europeu) e tenta adivinhar a codificação.

Se houver metadados (HTML / XML charset= , TeX \inputenc , emacs -*-coding-*- ,…) no arquivo, os editores avançados, como o Emacs ou o Vim, geralmente poderão analisar esses metadados. Isso não é fácil de automatizar a partir da linha de comando.

    
por 19.04.2011 / 23:13