Переключите кодирование терминала с помощью команды

24

Один из серверов, на котором я довольно часто sshиспользую западную кодировку вместо utf-8 (и я никак не могу это изменить).

Я начал писать сценарий bash для подключения к этому серверу, поэтому мне не придется каждый раз печатать полный адрес, но я хотел бы улучшить этот сценарий, чтобы он также корректно изменял кодировку окна терминала.

Изменение, которое мне нужно сделать, можно выполнить с помощью мыши, перейдя в «Терминал» -> «Установить кодировку символов ...» -> «Western (ISO-8859-1)». Есть ли команда терминала, которая делает то же самое для текущего окна / экрана терминала?

Для пояснения:
меня не интересуют способы переключения локали системы на удаленном сайте - эта система управляется кем-то другим, и я понятия не имею, что может зависеть от кодировки latin-1. То, что я хочу сделать, - это разрешить этому терминальному окну на моей стороне переключать кодировку символов на вышеупомянутую, точно так же, как я могу сделать это с помощью мыши и меню.

Томас Ашан
источник
Хороший вопрос! Кодирование проблемы часто ЛАВАШ ... Это путь , который не будет работать ... unix.stackexchange.com/questions/8859/...
lumbric
2
ВЫКЛ. Как это возможно, что мой ответ принят, но щедрость перешла к другому? :) :(
törzsmókus
1
@ törzsmókus: Вы можете прочитать о (новых?) правилах вознаграждения здесь: blog.stackoverflow.com/2010/06/improvements-to-bounty-system Если владелец вознаграждения не присуждает вознаграждение в течение 7-дневного периода вознаграждения, Применяются те же правила автоматического присуждения, что и раньше: любые ответы на вопрос, опубликованные после начала награды, по крайней мере с 2 отзывами, имеют право на автоматическое принятие и получают половину суммы вознаграждения. Если нет ответов, отвечающих этим критериям, награда не присуждается. И, опять же, все вознаграждения полностью независимы и не связаны с принятием ответа.
Руна

Ответы:

18

Вы ищете, luitкоторый предназначен для этой цели:

$ luit -encoding ISO-8859-1 ssh remote.host

Он преобразует вывод команды ssh в UTF-8, поэтому вам не нужно менять кодировку терминала.

törzsmókus
источник
2
Это верно. Тем не менее, я приземлился здесь в поисках этого бита на странице руководства luit: «Luit обычно вызывается прозрачно с помощью эмулятора терминала». Таким образом, для тех, кто прибывает сюда, потому что вы получаете неправильную кодировку, проходящую через ваш терминал, нормальный способ исправить это - изменить кодировку через эмулятор терминала.
joseph_morris
@joseph_morris позвольте мне указать вам на третий абзац ответа на вопрос. ОП было знать , как изменить кодировку с помощью команды меню эмулятора терминала (что вы называете «нормальный» путь) , но он искал альтернативу CLI.
törzsmókus
1
Да, именно поэтому я начал с "Это правильно". Тем не менее, эта страница теперь является одним из лучших хитов для «кодирования терминала», и я подумал, что небольшая документация по luit будет полезна для других, которые приходят сюда, пытаясь ответить «Почему моя кодировка терминала испорчена?» - и то, что это кодировка обычно изменяется в эмуляторе, а не в CLI.
joseph_morris
ах, теперь я понимаю вашу точку зрения.
törzsmókus
4

Сначала отредактируйте текущие локали в вашем любимом редакторе

sudo gedit /var/lib/locales/supported.d/local что-то вроде

en_GB.UTF-8 UTF-8
en_US.UTF-8 UTF-8
en_GB.ISO-8859-1 ISO-8859-1
en_US.ISO-8859-1 ISO-8859-1

Тогда беги sudo dpkg-reconfigure locales

Затем установите терминал с LANG=en_GB.ISO-8859-1

Надеюсь, что это работает

Джонатан
источник
4

Gnome Terminal использует gconf для хранения настроек. Этим можно управлять с помощью gconftoolИтак, вы можете использовать:

gconftool --set --type=string /apps/gnome-terminal/profiles/Default/encoding ISO-8859-1

Я проверил это 12.04. По некоторым причинам меню ( "Terminal"->"Set Character Encoding...") не обновляется в реальном времени, но фактическая кодировка символов корректно обновляется.

andrewsomething
источник
2
но это изменяет кодировку по умолчанию для всех терминалов, а не только для одного, на котором выполняется сценарий подключения ssh.
törzsmókus
3

Я не знаю, как это проверить, но с помощью Konsole в Kubuntu я могу сделать следующее:

1) Найти приложение зарегистрировано на dbus

$ qdbus

Я использую konsoleтак просто qdbus | grep konsдает мнеorg.kde.konsole

2) Найти текущие сессии в Konsole

$ qdbus org.kde.konsole | grep Sessions
/Sessions
/Sessions/1

$ set | grep -i sessions
KONSOLE_DBUS_SESSION=/Sessions/1

3) Найти полезные методы

$ qdbus org.kde.konsole /Sessions/1 | grep -i codec
method QByteArray org.kde.konsole.Session.codec()
method bool org.kde.konsole.Session.setCodec(QByteArray codec)

4) Проверьте текущую кодировку

$ qdbus org.kde.konsole /Sessions/1 org.kde.konsole.Session.codec
UTF-8

5) Установите кодировку

$ qdbus org.kde.konsole /Sessions/1 org.kde.konsole.Session.setCodec ISO-8859-1
true

6) Проверьте текущую кодировку

$ qdbus org.kde.konsole /Sessions/1 org.kde.konsole.Session.codec
ISO-8859-1

В Ubuntu будет аналогичная терминальная программа, но вам придется немного озадачиться правильными именем, путем, методом и аргументами.

jippie
источник
2

Вот еще одно решение, которое я использовал для изменения профиля (для цвета фона) при подключении к производственному серверу. Это вовлекает xdotool.

xdotoolбудет имитировать нажатия клавиш, необходимые для выбора нужного пункта меню. Попробуйте сначала с помощью клавиатуры, затем запишите последовательность:

$ xdotool key alt+t Down c Down Return

Это активирует первую кодировку символов. Добавьте еще Downключи перед тем, Returnчтобы выбрать другой.

Примечание: для ssh, вы также можете использовать ~/.ssh/configфайл для настройки псевдонимов для ваших серверов.

nniico
источник
Извините - я хотел дать вам награду, но нажал не на тот пост = (
Томас Ашан
так как меню gnome-терминала не гарантированно не изменится, я считаю это очень хрупким хаком, который может быть правильным, когда нет реального решения. но есть один .
törzsmókus
1

Включите xterm, измените кодировку, используя управляющие последовательности . Например, внутри bashвы получите набор символов UTF-8, выполнив:

echo -n $'\e%G'

Кодирование ISO 8859-1 доступно при запуске:

echo -n $'\e%@'
vsnprintf
источник