Невозможно отобразить файл, закодированный в ISO-8859-9, на терминал
Вкратце: как я могу отобразить файл на терминал, который не закодирован в UTF-8?
В настоящее время у меня есть тестовый файл, закодированный в ISO-8859-9 и содержащий следующие 12 символов:
ğüşıöçĞÜŞİÖÇ
Шестнадцатеричное содержимое файла выглядит так:
\F0\FC\FE\FD\F6\E7\D0\DC\DE\DD\D6\C7
Когда я пытаюсь отобразить этот файл в терминале, я получаю:
������������
Я думаю, это потому, что моя текущая локаль определяется так:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=en_GB.UTF-8
LC_TIME=en_GB.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=en_GB.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=en_GB.UTF-8
LC_NAME=en_GB.UTF-8
LC_ADDRESS=en_GB.UTF-8
LC_TELEPHONE=en_GB.UTF-8
LC_MEASUREMENT=en_GB.UTF-8
LC_IDENTIFICATION=en_GB.UTF-8
LC_ALL=
Тем не менее, я установил турецкий язык в систему:
$ locale -a
C
C.UTF-8
en_GB
en_GB.iso88591
en_GB.iso885915
en_GB.utf8
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
POSIX
tr_TR
tr_TR.iso88599
tr_TR.utf8
turkish
Итак, я хочу временно изменить язык отображения следующим образом:
$ export LC_ALL=tr_TR.iso88599
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE="tr_TR.iso88599"
LC_NUMERIC="tr_TR.iso88599"
LC_TIME="tr_TR.iso88599"
LC_COLLATE="tr_TR.iso88599"
LC_MONETARY="tr_TR.iso88599"
LC_MESSAGES="tr_TR.iso88599"
LC_PAPER="tr_TR.iso88599"
LC_NAME="tr_TR.iso88599"
LC_ADDRESS="tr_TR.iso88599"
LC_TELEPHONE="tr_TR.iso88599"
LC_MEASUREMENT="tr_TR.iso88599"
LC_IDENTIFICATION="tr_TR.iso88599"
LC_ALL=tr_TR.iso88599
$ cat a.txt
������������
Но я все еще получаю знаки вопроса.
1 ответ
Решение
Вы можете использовать iconv
утилита (примечание: она не преобразует файл на месте; преобразованный вывод отображается в терминале, если вы не перенаправите его в другое место).
Ex.
$ file file.ISO-8859-9
file.ISO-8859-9: ISO-8859 text
$ cat file.ISO-8859-9
������������
$ iconv -f ISO-8859-9 -t utf-8//translit file.ISO-8859-9
ğüşıöçĞÜŞİÖÇ