Кодировки символов, поддерживаемые more, cat и less

18

У меня есть текстовый файл в следующем формате file:

Текст ISO-8859, с ограничителями строки CRLF

Этот файл содержит текст на французском языке с акцентами. Моя оболочка способна отображать акцент и emacsв режиме консоли способна правильно отображать эти акценты.

Моя проблема в том more, catи lessинструменты не отображают этот файл правильно. Я предполагаю, что это означает, что эти инструменты не поддерживают этот набор кодировки символов. Это правда? Какие кодировки символов поддерживаются этими инструментами?

Мануэль Сельва
источник

Ответы:

17

Ваша оболочка может отображать акценты и т.д., потому что она, вероятно, использует UTF-8. Поскольку рассматриваемый файл представляет собой другую кодировку, less moreи catпытаются прочитать его как UTF и не удается. Вы можете проверить текущую кодировку с

echo $LANG

У вас есть два варианта: вы можете изменить кодировку по умолчанию или изменить файл на UTF-8. Чтобы изменить кодировку, откройте терминал и введите

export LANG="fr_FR.ISO-8859"

Например:

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

Если вы используете gnome-terminalили подобное, вам может потребоваться активировать кодировку, например, для terminatorщелчка правой кнопкой мыши и:

введите описание изображения здесь

Для gnome-terminal:

введите описание изображения здесь

Другой (лучший) вариант - изменить кодировку файла:

$ 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!
Тердон
источник
4

Кодировки ISO-8858 немного устарели для систем Linux. Вся ваша система Linux, вероятно, полностью использует UTF-8. Включая ваш эмулятор терминала и вашу оболочку.

Тем не мение. cat, grepИ lessне делать какое - либо преобразования кодирования, они будут относиться к вашему ISO-8859 / latin1 файла в UTF-8, который не будет работать.

Если emacs может их отобразить, то это потому, что он пытается автоматически определить используемую кодировку и, очевидно, успешно. Скажите emacs, чтобы сохранить файл как UTF-8, и вы сможете использовать cat/ grep/ все, что на нем.

Если вы знаете точную кодировку символов (ISO-8859 представляет собой набор из них, вы должны знать точную кодировку: ISO-8859-1 или ISO-8859-15 или хуже), вы также можете конвертировать свои файлы из командной строки :

iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
BatchyX
источник
2

Cat, More и Less просто делают свою работу по отображению файла. Перевод между кодировками не входит в их описание работы. Кодирование новых строк не является проблемой, поскольку CRLF отображается так же, как обычная строка, заканчивающаяся LF, но ваш терминал, вероятно, ожидает кодированный в UTF-8 текст, который в настоящее время является стандартом де-факто.

Luit переводит между поддерживаемыми кодировками и UTF-8. Вы указываете Luit, какую кодировку переводить, устанавливая LC_CTYPEпеременную окружения или с помощью -encodingопции. Например, для отображения файла latin-1 (он же ISO 8859-1):

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

Если файл находится в какой-то экзотической кодировке, которую Luit не поддерживает, вы можете передать его через программу-переводчик. Iconv поддерживает множество кодировок.

iconv -f latin1 somefile
iconv -f latin1 somefile | less
Жиль "ТАК - прекрати быть злым"
источник