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

18

Eu tenho um arquivo de texto codificado da seguinte forma file:

Texto ISO-8859, com terminadores de linha CRLF

Este arquivo contém o texto em francês com acentos. Meu shell é capaz de exibir sotaque e emacsno modo console é capaz de exibir corretamente esses sotaques.

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

Manuel Selva
fonte

Respostas:

17

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

echo $LANG

Você tem duas opções: 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-terminalou semelhante, pode ser necessário ativar a codificação, por exemplo, para terminatorclicar com o botão direito e:

insira a descrição da imagem aqui

Para gnome-terminal:

insira a descrição da imagem aqui

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!
terdon
fonte
4

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

Contudo. cat, grepe lessnã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 detectar automaticamente a codificação usada e aparentemente tem êxito. Diga ao emacs para salvar o arquivo como UTF-8 e você poderá usar cat/ grep/ o que quer que esteja nele.

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

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
BatchyX
fonte
2

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

Luit converte entre codificações suportadas e UTF-8. Você diz a Luit qual codificação converter, definindo a LC_CTYPEvariável de ambiente ou com a -encodingopção Por exemplo, para exibir um arquivo latin-1 (também conhecido como 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ê poderá direcioná-lo através de um programa tradutor. Iconv suporta muitas codificações.

iconv -f latin1 somefile
iconv -f latin1 somefile | less
Gilles 'SO- parar de ser mau'
fonte