Kodowanie znaków obsługiwane przez more, cat i less

18

Mam plik tekstowy zakodowany w następujący sposób zgodnie z file:

Tekst ISO-8859, z zakończeniami linii CRLF

Ten plik zawiera tekst francuski z akcentami. Moja powłoka może wyświetlać akcent, aw emacstrybie konsoli jest w stanie poprawnie wyświetlać te akcenty.

Mój problem polega na tym more, cati lessnarzędzia nie poprawnie wyświetlić ten plik. Myślę, że to oznacza, że ​​te narzędzia nie obsługują tego zestawu kodowania znaków. Czy to prawda? Jakie kodowania znaków są obsługiwane przez te narzędzia?

Manuel Selva
źródło

Odpowiedzi:

17

Twoja powłoka może wyświetlać akcenty itp., Ponieważ prawdopodobnie używa UTF-8. Ponieważ plik, o którym mowa, ma inne kodowanie less morei catpróbują go odczytać jako UTF i nie udaje się. Możesz sprawdzić swoje obecne kodowanie za pomocą

echo $LANG

Masz dwie możliwości: możesz zmienić domyślne kodowanie lub zmienić plik na UTF-8. Aby zmienić kodowanie, otwórz terminal i wpisz

export LANG="fr_FR.ISO-8859"

Na przykład:

$ 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!

Jeśli używasz gnome-terminallub podobnego, może być konieczne aktywowanie kodowania, na przykład dla terminatorkliknięcia prawym przyciskiem myszy i:

wprowadź opis zdjęcia tutaj

Dla gnome-terminal:

wprowadź opis zdjęcia tutaj

Inną (lepszą) opcją jest zmiana kodowania pliku:

$ 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
źródło
4

Kodowanie znaków ISO-8858 jest nieco nieaktualne dla systemów Linux. Twój cały system Linux prawdopodobnie używa UTF-8 do samego końca. W tym emulator terminala i powłoka.

Jednak. cat, grepI lessnie robić żadnych transformacji kodowania, będą traktować ISO-8859 / plik latin1 jako UTF-8, które nie będą działać.

Jeśli emacs jest w stanie je wyświetlić, to dlatego, że próbuje automatycznie wykryć zastosowane kodowanie i najwyraźniej się udało. Powiedz emacsowi, aby zapisał plik jako UTF-8, a będziesz mógł użyć cat/ grep/ cokolwiek na nim.

Jeśli znasz dokładne kodowanie znaków (ISO-8859 jest ich zbiorem, musisz znać dokładne: ISO-8859-1 lub ISO-8859-15 lub gorzej), możesz także konwertować pliki z wiersza poleceń :

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
BatchyX
źródło
2

Cat, More and Less po prostu wykonują zadanie wyświetlania pliku. Tłumaczenie między kodowaniami nie jest w opisie ich pracy. Kodowanie znaków nowej linii nie stanowi problemu, ponieważ CRLF jest wyświetlany tak jak normalna linia kończąca się na LF, ale twój terminal prawdopodobnie oczekuje tekstu zakodowanego w UTF-8, który jest obecnie de facto standardem.

Luit tłumaczy między obsługiwanymi kodowaniami a UTF-8. Mówisz Luitowi, które kodowanie należy przetłumaczyć, ustawiając LC_CTYPEzmienną środowiskową lub -encodingopcję. Na przykład, aby wyświetlić plik Latin-1 (alias ISO 8859-1):

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

Jeśli plik ma jakieś egzotyczne kodowanie, którego Luit nie obsługuje, możesz przesłać go przez program tłumaczący. Iconv obsługuje wiele kodowań.

iconv -f latin1 somefile
iconv -f latin1 somefile | less
Gilles „SO- przestań być zły”
źródło