Кодировки символов, поддерживаемые больше, кошка и меньше

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

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

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

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

Ваша оболочка может отображать акценты и т. Д., Потому что она, вероятно, использует UTF-8. Поскольку этот файл является другой кодировкой, less и 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 или аналогичный, вам может понадобиться активировать кодировку, например, для щелчка правой кнопкой мыши и:

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

Для 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! 

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

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

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

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

 iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8 

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

Luit переводит между поддерживаемыми кодировками и UTF-8. Вы -encoding кодирование которого выполняется для перевода, задав переменную среды LC_CTYPE или опцию -encoding . Например, для отображения файла latin-1 (aka 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