Переключити кодування терміналу командою


24

Один із серверів я досить часто sshвикористовую західне кодування замість utf-8 (і я не можу це змінити).

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

Зміни, які мені потрібно зробити, можна виконати за допомогою миші, перейшовши до "Термінал" -> "Встановити кодування символів ..." -> "Вестерн (ISO-8859-1)". Чи є команда термінала, яка робить те саме, для поточного вікна / екрана терміналу?

Для уточнення:
мене не цікавлять способи переключення локальної системи на віддалений сайт - цією системою керує хтось інший, і я не маю уявлення, які речі можуть залежати від кодування латиніни-1 там. Що я хочу зробити, це дозволити це вікно терміналу на моєму боковому перемиканні кодування символів на вищезазначене, так само, як я можу зробити мишу та меню.


Гарне питання! Проблеми з кодуванням часто є PITA ... Це спосіб, який не буде працювати ... unix.stackexchange.com/questions/8859/…
lumbric

2
ВИКЛЮЧЕНО, як можливо, що моя відповідь прийнята, але щедрість перейшла до іншої? :) :(
törzsmókus

1
@ törzsmókus: Про (нові?) правила винагороди ви можете прочитати тут: blog.stackoverflow.com/2010/06/improvements-to-bounty-system Якщо власник щедрості не присуджує цю суму протягом 7 днів, діють ті самі правила автоматичного присудження, що і раніше: будь-які відповіді на запитання, розміщені після початку роботи, з принаймні двома результатами, мають право на автоматичне прийняття та заробляють половину суми. Якщо відповіді не відповідають цим критеріям, жодна винагорода не присуджується. - і, знову ж таки, всі щедрості абсолютно незалежні від прийняття відповіді і не пов'язані з ними.
Руна

Відповіді:


18

Ви шукаєте, luitякий призначений для цієї мети:

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

Він перетворить вихід команди ssh в UTF-8, тому вам не потрібно змінювати кодування терміналу.


2
Це вірно. Однак я приземлився тут, шукаючи цей шматочок зі сторінки чоловіка luit: "Luit зазвичай прозоро викликається емулятором терміналу". Отже, для тих, хто приїжджає сюди, оскільки ви отримуєте неправильне кодування, що проходить через ваш термінал, звичайний спосіб виправити це - змінити кодування через емулятор терміналу.
joseph_morris

@joseph_morris дозвольте мені вказати на третій абзац відповіді. ОП було знати , як змінити кодування з допомогою команди меню емулятора терміналу (що ви називаєте «нормальний» шлях) , але він шукав альтернативу CLI.
törzsmókus

1
Правильно, саме тому я почав із "Це правильно". Однак ця сторінка зараз є одним із найкращих звернень до "термінального кодування", і я вважав, що трохи документації про користь буде корисним для інших, хто приїздить сюди, намагаючись відповісти "Чому кодування мого терміналу зіпсовано?" - і що воно кодування зазвичай змінюється в емуляторі, а не 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 використовує gconf для зберігання налаштувань. З ними можна маніпулювати, gconftoolОтже, ви можете використовувати:

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

Я перевірив це 12.04. Чомусь меню ( "Terminal"->"Set Character Encoding..."), здається, не оновлюється в режимі реального часу, але фактичне кодування символів дійсно оновлюється.


2
але це змінює кодування за замовчуванням для всіх терміналів, а не лише того, на якому запущено скрипт з'єднання ssh.
törzsmókus

3

Я не знаю, як це перевірити, але з Konsole на Kubuntu я можу зробити наступне:

1) Знайдіть додаток, зареєстроване на dbus

$ qdbus

Я використовую konsoleтак простий qdbus | grep konsдає меніorg.kde.konsole

2) Знайдіть поточні сесії в Консолі

$ 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 буде подібна термінальна програма, але вам доведеться трохи спантеличити себе правильним іменем служби, шляхом, методом та аргументами.


2

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

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

$ xdotool key alt+t Down c Down Return

Це активує кодування першого символу. Додайте більше Downклавіш перед, Returnщоб вибрати інші.

Примітка. Тому що sshви також можете використовувати ~/.ssh/configфайл для налаштування псевдонімів для своїх серверів.


Вибачте - я мав намір надати вам щедрий реп, але натиснув неправильний пост = (
Томаш Ашан

оскільки меню gnome-терміналу не гарантується, що воно не зміниться, я вважаю це надзвичайно крихким хаком, що може бути правильним, коли немає фактичного рішення. але є одна .
törzsmókus

1

Увімкніть xtermзміну кодування за допомогою керуючих послідовностей . Наприклад, всередині bashви отримуєте набір символів UTF-8, запустивши:

echo -n $'\e%G'

Кодування ISO 8859-1 доступне за допомогою запуску:

echo -n $'\e%@'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.