Codificações de caracteres suportadas por mais, gato e menos

18

Eu tenho um arquivo de texto codificado como segue de acordo com file :

ISO-8859 text, with CRLF line terminators

Este arquivo contém o texto de francês com acentos. Meu shell é capaz de exibir o acento e emacs no modo de console é capaz de exibir corretamente esses acentos.

Meu problema é que as ferramentas more , cat e less não exibem esse arquivo corretamente. Eu acho que isso significa que essas ferramentas não suportam este conjunto de codificação de caracteres. Isso é verdade? Quais são as codificações de caracteres suportadas por essas ferramentas?

    
por Manuel Selva 09.06.2013 / 13:38

3 respostas

16

Seu shell pode exibir acentos, etc., porque provavelmente está usando o UTF-8. Como o arquivo em questão é uma codificação diferente, less more e cat estão tentando lê-lo como UTF e falhar. Você pode verificar sua codificação atual com

echo $LANG

Você tem duas opções, você pode alterar sua codificação padrão ou alterar o arquivo para UTF-8. Para alterar sua codificação, abra um terminal e digite

export LANG="fr_FR.ISO-8859"

Por exemplo:

$ echo $LANG 
en_US.UTF-8
$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ export LANG="fr_FR.ISO-8859"
$ xterm <-- open a new terminal 
$ cat foo.txt 
J'ai mal à la tête, c'est chiant!

Se você estiver usando gnome-terminal ou similar, talvez seja necessário ativar a codificação, por exemplo, para terminator clique direito e:

Paragnome-terminal:

Sua outra opção (melhor) é alterar a codificação do arquivo:

$ cat foo.txt 
J'ai mal � la t�te, c'est chiant!
$ iconv -f ISO-8859-1 -t UTF-8  foo.txt > bar.txt
$ cat bar.txt 
J'ai mal à la tête, c'est chiant!
    
por 09.06.2013 / 15:07
4

As codificações de caracteres ISO-8858 estão um pouco desatualizadas para sistemas Linux. Todo o seu sistema Linux provavelmente está usando o UTF-8 até o fim. Incluindo seu emulador de terminal e seu shell.

No entanto. cat , grep e less não fazem nenhuma transformação de codificação, eles tratarão seu arquivo ISO-8859 / latin1 como UTF-8, o que não funcionará.

Se o emacs é capaz de exibi-los, é porque ele tenta autodetectar a codificação usada e aparentemente bem-sucedida. Diga ao emacs para salvar o arquivo como UTF-8 e você poderá usar cat / grep / whatever nele.

Se você sabe a codificação exata de caracteres (ISO-8859 é uma coleção deles, você precisa saber exatamente o que é: ISO-8859-1 ou ISO-8859-15 ou pior), você também pode converter seus arquivos de a linha de comando:

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
    
por 09.06.2013 / 15:01
3

Cat, More e Less estão apenas fazendo o trabalho de exibir o arquivo. Traduzir entre codificações não está em sua descrição de trabalho. A codificação de novas linhas não é um problema, pois o CRLF é exibido exatamente como a linha normal terminando em LF, mas seu terminal provavelmente está esperando texto codificado em UTF-8, que é o padrão de fato atualmente.

Luit traduz entre codificações suportadas e UTF-8. Você diz ao Luit qual codificação deve ser traduzida definindo a variável de ambiente LC_CTYPE ou com a opção -encoding . Por exemplo, para exibir um arquivo latin-1 (a.k.a. ISO 8859-1):

LC_CTYPE=en_US luit less somefile
luit -encoding ISO8859-1 less somefile

Se o arquivo estiver em alguma codificação exótica que o Luit não suporta, você pode canalizá-lo através de um programa de conversão. Iconv suporta muitas codificações.

iconv -f latin1 somefile
iconv -f latin1 somefile | less
    
por 10.06.2013 / 09:58