Как получить кодировку символов терминала

Ответы:

108

Терминал использует переменные среды, чтобы определить, какой набор символов использовать, поэтому вы можете определить его, посмотрев на эти переменные:

echo $LC_CTYPE

или

echo $LANG
Валдис
источник
4
Эти переменные среды используются приложениями, использующими терминал для ввода-вывода. Сам эмулятор терминала ничего о них не знает, и его текущая эффективная кодировка символов - это настройка где-то в программе эмулятора (член данных внутри класса libvte в случае терминала GNOME).
JdeBP
1
предлагаемый здесь порядок переменных не очень хорош. более полное решение могло бы выглядеть примерно так: echo $ {LC_ALL: - $ {LC_CTYPE: - $ {LANG}}}. опять же, устанавливаемая переменная не является гарантией того, что они действительны, поэтому вы должны придерживаться localeпрограммы (как показано в других ответах здесь).
Майк Фрайсингер
Как сказал @JdeBP, терминал не использует localeпеременные среды для определения своей кодировки. Однако терминал может сообщить приложениям, которые с ним взаимодействуют, свою кодировку, установив localeпеременные среды. Например, на MacOS вы можете выбрать кодировку терминала и , возможно , установить localeпеременные окружения при запуске терминала в Terminal> Preferences> Profiles> Advanced.
Maggyero
97

locale команда без аргументов распечатает значения всех соответствующих переменных среды, кроме LANGUAGE.

Для текущей кодировки:

locale charmap

Для доступных языков:

locale -a

Для доступных кодировок:

locale -m
nyzm
источник
1
Это то, что у меня сработало в системе CentOS. Он показал кодировку системы на основе текущих языковых настроек. Настройки терминала, используемые для доступа к этой машине, - это другая история и функция используемого клиента.
Phil DD
45

Проверьте кодировку и язык:

$ echo $LC_CTYPE
ISO-8859-1
$ echo $LANG
pt_BR

Получить все языки:

$ locale -a

Измените на pt_PT.utf8:

$ export LC_ALL=pt_PT.utf8 
$ export LANG="$LC_ALL"
Moreno
источник
16

Если у вас есть Python:

python -c "import sys; print(sys.stdout.encoding)"
Мартин Тома
источник
1
Из всех вышеперечисленных предложений единственным предложением, которое сработало с моим ящиком Slackware64 v. 14.2, был этот фрагмент Python. Спасибо!
Thomas Altfather Good
6

Насколько мне известно, нет.

Косвенные признаки из $LC_CTYPE, localeкажется , и такая мощь заманчиво, но они полностью отделены друг от кодирующего приложения терминала ( на самом деле эмулятор) , случается, используя при отображении символов на экране.

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

К сожалению, это невозможно.

pythonator
источник
0

Чтобы увидеть информацию о текущем языковом стандарте, используйте localeкоманду. Ниже приведен пример на RHEL 7.8.

[usr@host ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
Ашиш Бхосле
источник