Wie erkennt man die aktuelle Zeichenkodierung des Gnome-Terminals?

Wie erkennt man die aktuelle Zeichenkodierung des Gnome-Terminals?

Ich versuche, die aktuelle gnome-terminalZeichenkodierung über die Befehlszeile zu ermitteln. Ich habe Folgendes versucht gconftool:

$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
current
$ gconftool-2 --type string --set /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8
$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8

Wenn ich jetzt aber ins gnome-terminalMenü gehe und wähle Terminal->Set Character Encoding->ISO-8859-10und dann nochmal ausführen

$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8

Die Kodierung /apps/gnome-terminal/profiles/Default/encodingwurde also nicht geändert, ISO-8859-10obwohl das Terminal diese Kodierung verwendet. Daher scheint es gconftoolnicht möglich zu sein, die aktuelle Kodierung zu bestimmen.

Antwort1

Ich empfehle, locale charmapdie Ausgabe von zu überprüfen (die die von $LANG, $LC_CTYPE, $LC_ALL festgelegten Werte meldet). Diese fragt das Terminal nicht direkt ab, aber es ist für die meisten Anwendungen wichtig, dass das Gebietsschema korrekt und konsistent mit dem Terminal eingerichtet ist. Wenn etwas anderes als das tatsächliche Verhalten gemeldet wird, verhält sich nicht nur Ihre App, sondern so ziemlich jede andere App im Terminal falsch, und das ist nicht Ihre Schuld. Natürlich kann der Benutzer die Kodierung über das Menü ändern, aber wenn er sich dazu entschließt, sich selbst ins Bein zu schießen, können/sollten Sie nicht viel dagegen tun. Es ist nicht Ihre Aufgabe, eine fehlerhafte systemweite Einstellung zu erkennen. Außerdem können Sie nicht feststellen, ob der Benutzer die Kodierung ändert, während Ihre App ausgeführt wird. Daher halte ich es nicht für sinnvoll, dies beim Start zu überprüfen.

Wenn Sie das Laufzeitverhalten wirklich überprüfen müssen, können Sie Escape-Sequenzen ausgeben, die die Cursorposition abfragen (und sie in einem bestimmten Format zurückmelden, als ob sie über die Tastatur eingegeben worden wäre), dann einige Bytes ausgeben, die z. B. ein einzelnes Zeichen in UTF-8 bilden, während mehrere Zeichen in einer anderen Kodierung vorhanden sind (in der Zwischenzeit das lokale Echo deaktivieren, sodass Tastendrücke des Benutzers den Cursor nicht weiterbewegen) und die Cursorposition erneut abfragen. Das ist vielleicht zu viel Aufwand und den Aufwand wirklich nicht wert.

Antwort2

Hier ist eine Halblösung, die sich mit dem Problem befasst, die Kodierung zu bestimmen, wenn /apps/gnome-terminal/profiles/Default/encodinggleich der Zeichenfolge ist current. Angenommen, die Zeichenfolge currentbedeutet, dass gnome-terminaldas aktuelle Gebietsschema verwendet werden soll.

Es ist verlockend, die Variable zu überprüfen LANG, um die Kodierung zu bestimmen, aber lautDasFrage, das ist nicht zuverlässig. Stattdessen I18N::Langinfosollte das Perl-Modul verwendet werden:

temp=$(gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding)

if [[ $temp == "current" ]] ; then
    perl -MI18N::Langinfo=langinfo,CODESET -E 'say langinfo(CODESET())'
else
    echo $temp
fi

Beachten Sie, dass diese Antwort nicht auf das Problem der Bestimmung der Kodierung eingeht gnome-terminal, wenn der Benutzer die Kodierung manuell über das Menü ändert gnome-terminal.

verwandte Informationen