Przełącz kodowanie terminala za pomocą polecenia

24

Jeden z serwerów dość często używam sshzachodniego kodowania zamiast utf-8 (i nie ma sposobu, żebym mógł to zmienić).

Zacząłem pisać skrypt bash, aby połączyć się z tym serwerem, więc nie będę musiał za każdym razem wpisywać całego adresu, ale chciałbym ulepszyć ten skrypt, aby poprawnie zmieniał także kodowanie okna terminala.

Zmianę, którą muszę wykonać, można wykonać za pomocą myszy, przechodząc do opcji „Terminal” -> „Ustaw kodowanie znaków ...” -> „Western (ISO-8859-1)”. Czy istnieje polecenie terminalu, które robi to samo, dla bieżącego okna / ekranu terminala?

W celu wyjaśnienia:
ja nie zainteresowany sposobów przełączania ustawień regionalnych systemu na zdalnym serwerze - że system administrowany jest przez kogoś innego, a ja nie mam pojęcia, co rzeczy może zależeć od Latin-1, kodujący tam. Chcę, aby okno terminalu po mojej stronie przełączyło kodowanie znaków na wyżej wymienione, w taki sam sposób, jak mogę to zrobić za pomocą myszy i menu.

Tomas Aschan
źródło
Dobre pytanie! Problemy z kodowaniem są często PITA ... To sposób, który nie zadziała ... unix.stackexchange.com/questions/8859/
lumbric
2
OFF, jak to możliwe, że moja odpowiedź została zaakceptowana, ale nagroda trafiła do innej? :) :(
törzsmókus
1
@ törzsmókus: Możesz przeczytać o (nowych?) zasadach nagrody tutaj: blog.stackoverflow.com/2010/06/improvements-to-bounty-system Jeśli właściciel nagrody nie przyzna nagrody za 7 dni, obowiązują te same zasady automatycznego przyznawania nagród, jak poprzednio: wszelkie odpowiedzi na pytanie zadane po rozpoczęciu nagrody, z co najmniej 2 głosami pozytywnymi, kwalifikują się do automatycznego przyjęcia i zarabiają połowę kwoty nagrody. Jeśli nie ma żadnych odpowiedzi spełniających te kryteria, nagroda nie jest przyznawana. - i znowu wszystkie nagrody są całkowicie niezależne i niezwiązane z przyjęciem odpowiedzi.
Run

Odpowiedzi:

18

Szukasz, luitktóry jest przeznaczony do tego celu:

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

Konwertuje dane wyjściowe polecenia ssh na UTF-8, więc nie trzeba zmieniać kodowania terminala.

törzsmókus
źródło
2
To jest poprawne. Jednak wylądowałem tutaj, szukając tego fragmentu ze strony podręcznika luit: „Luit jest zwykle wywoływany transparentnie przez emulator terminala”. Tak więc dla przybywających tutaj, ponieważ w twoim terminalu pojawia się nieprawidłowe kodowanie, normalnym sposobem na jego naprawienie jest zmiana kodowania za pomocą emulatora terminala.
joseph_morris
@Joseph_Morris, pozwól, że wskażę trzeci akapit pytania, na które udzielono odpowiedzi. PO nie wie jak zmienić kodowanie za pomocą poleceń menu terminala emulator (które nazywamy „normalny” sposób), ale szukał alternatywy CLI.
törzsmókus
1
Właśnie dlatego zacząłem od „To prawda”. Jednak ta strona jest obecnie jednym z najpopularniejszych haseł dla „kodowania terminala” i pomyślałem, że ta odrobina dokumentacji dla litea przydałaby się innym, którzy tu przybędą, próbując odpowiedzieć „Dlaczego moje kodowanie terminala jest pomieszane?” - i że kodowanie jest zwykle zmieniane w emulatorze, a nie CLI.
joseph_morris
ah, teraz rozumiem twój punkt widzenia.
törzsmókus
4

Najpierw edytuj bieżące ustawienia narodowe w swoim ulubionym edytorze

sudo gedit /var/lib/locales/supported.d/local do czegoś takiego

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

Następnie uruchomić sudo dpkg-reconfigure locales

Następnie ustaw terminal za pomocą LANG=en_GB.ISO-8859-1

Mam nadzieję, że to działa

Jonathan
źródło
4

Gnome Terminal używa gconf do przechowywania ustawień. Można nimi manipulować gconftool, więc możesz użyć:

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

Przetestowałem to 12.04. Z jakiegoś powodu menu ( "Terminal"->"Set Character Encoding...") wydaje się nie być aktualizowane w czasie rzeczywistym, ale rzeczywiste kodowanie znaków jest aktualizowane poprawnie.

andrews coś
źródło
2
ale to zmienia domyślne kodowanie dla wszystkich terminali, nie tylko tego, w którym działa skrypt połączenia ssh.
törzsmókus
3

Nie wiem, jak to przetestować, ale dzięki Konsole na Kubuntu mogę wykonać następujące czynności:

1) Znajdź aplikację zarejestrowaną w dbus

$ qdbus

Używam konsoletak prosty qdbus | grep konsdaje miorg.kde.konsole

2) Znajdź bieżące sesje w Konsole

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

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

3) Znajdź przydatne metody

$ 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) Sprawdź aktualne kodowanie

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

5) Ustaw kodowanie

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

6) Sprawdź aktualne kodowanie

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

Ubuntu będzie miał podobny program terminalowy, ale będziesz musiał rozwiązać zagadkę, podając poprawną nazwę usługi, ścieżkę, metodę i argumenty.

jippie
źródło
2

Oto inne rozwiązanie, którego użyłem do zmiany profilu (dla koloru tła) podczas łączenia się z serwerem produkcyjnym. To dotyczy xdotool.

xdotoolsymuluje naciśnięcia klawiszy potrzebne do wybrania żądanego elementu menu. Spróbuj najpierw na klawiaturze, a następnie zapisz sekwencję:

$ xdotool key alt+t Down c Down Return

Aktywuje kodowanie pierwszego znaku. Dodaj więcej Downkluczy przed, Returnaby wybrać inny.

Uwaga: dla pliku sshmożna również użyć ~/.ssh/configpliku do skonfigurowania aliasów do serwerów.

nniico
źródło
Przepraszam - chciałem dać ci przedstawiciela nagrody, ale kliknąłem zły post = (
Tomas Aschan
ponieważ nie można zagwarantować, że menu terminala gnome się nie zmieni, uważam to za bardzo delikatny hack, co może być właściwe, gdy nie ma rzeczywistego rozwiązania. ale jest jeden .
törzsmókus
1

Włącz xterm, zmień kodowanie za pomocą sekwencji kontrolnych . Na przykład, bashmożesz uzyskać zestaw znaków UTF-8, uruchamiając:

echo -n $'\e%G'

Kodowanie ISO 8859-1 jest dostępne po uruchomieniu:

echo -n $'\e%@'
vsnprintf
źródło