Ich versuche, die aktuelle gnome-terminal
Zeichenkodierung ü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-terminal
Menü gehe und wähle Terminal->Set Character Encoding->ISO-8859-10
und dann nochmal ausführen
$ gconftool-2 --get /apps/gnome-terminal/profiles/Default/encoding
en_US.UTF-8
Die Kodierung /apps/gnome-terminal/profiles/Default/encoding
wurde also nicht geändert, ISO-8859-10
obwohl das Terminal diese Kodierung verwendet. Daher scheint es gconftool
nicht möglich zu sein, die aktuelle Kodierung zu bestimmen.
Antwort1
Ich empfehle, locale charmap
die 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/encoding
gleich der Zeichenfolge ist current
. Angenommen, die Zeichenfolge current
bedeutet, dass gnome-terminal
das 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::Langinfo
sollte 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
.