現在の gnome-terminal の文字エンコーディングを検出するにはどうすればいいですか?

現在の gnome-terminal の文字エンコーディングを検出するにはどうすればいいですか?

gnome-terminalコマンドラインから現在の文字エンコードを検出しようとしています。以下を使用してみました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

しかし、メニューを開いてgnome-terminal選択しTerminal->Set Character Encoding->ISO-8859-10、再度実行すると

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

そのため、端末がそのエンコーディングを使用しているにもかかわらず、のエンコーディングは/apps/gnome-terminal/profiles/Default/encoding変更されていません。したがって、現在のエンコーディングを判別するために使用することはできないようです。ISO-8859-10gconftool

答え1

の出力を確認することをお勧めしますlocale charmap($LANG、$LC_CTYPE、$LC_ALL で設定された値が報告されます)。これはターミナルを直接照会しませんが、ほとんどのアプリケーションでは、ロケールがターミナルと一貫して正しく設定されていることが不可欠です。実際の動作以外のものが報告された場合、あなたのアプリだけでなく、他のほとんどすべてのアプリがターミナルで誤動作することになり、それはあなたのせいではありません。もちろん、ユーザーはメニューからエンコーディングを変更できますが、ユーザーが自ら首を絞めようと決めた場合、あなたができること/すべきことはあまりありません。システム全体の設定の誤りを検出するのはあなたの仕事ではありません。また、アプリの実行中にユーザーがエンコーディングを切り替えたかどうかを知る方法はないので、起動時に確認してもあまり意味がないと思います。

実行時の動作を本当に確認する必要がある場合は、カーソルの位置を照会するエスケープ シーケンスを出力し (キーボードから入力されたかのように特定の形式で報告します)、次に、たとえば UTF-8 では 1 文字、その他のエンコードでは複数の文字を形成するバイトを出力し (その間にローカル エコーを無効にすると、ユーザーによるキー入力でカーソルが進まない)、再度カーソルの位置を照会します。これはおそらく面倒すぎて、労力に見合う価値はありません。

答え2

/apps/gnome-terminal/profiles/Default/encoding以下は、が文字列 に等しい場合にエンコーディングを決定する問題に対処する半分の解決策です current。文字列 は、が現在のロケールを使用する必要があるcurrentことを意味していると仮定します。gnome-terminal

変数をチェックしLANGてエンコードを決定したくなるが、これ質問ですが、それは信頼できません。代わりに Perl モジュールをI18N::Langinfo使用する必要があります。

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

gnome-terminalこの回答では、ユーザーがメニューからエンコーディングを手動で変更する場合のエンコーディングの決定の問題には対処していないことに注意してくださいgnome-terminal

関連情報