コマンドラインから現在の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-10
に変更されていません。したがって、gconftool
は現在のエンコーディングを決定するために使用できないようです。
locale charmap
の出力($ LANG、$ LC_CTYPE、$ LC_ALLで設定された値を報告する)を確認することをお勧めします。これは端末に直接クエリを送信しませんが、ほとんどのアプリケーションではロケールが端末と一貫して正しく設定されていることが重要です。実際の動作以外の何かを報告する場合、アプリだけでなく、他のほとんどすべてのアプリがターミナルで誤動作し、それはあなたのせいではありません。もちろん、ユーザーはメニューからエンコードを変更できますが、自分で足を撃つことに決めた場合、あなたができる/すべきでないことはあまりありません。障害のあるシステム全体の設定を検出するのはあなたの仕事ではありません。また、アプリの実行中にユーザーがエンコードを切り替えるかどうかに気付く方法がないため、起動時に検証することはあまり意味がないと思います。
本当に実行時の動作を確認する必要がある場合は、カーソル位置を照会するエスケープシーケンスを送信し(キーボードから入力されたかのように特定の形式で報告する)、その後、いくつかのバイトを送信できます。 UTF-8で単一の文字を形成し、他のエンコーディングでは複数の文字を形成し(その間ローカルエコーを無効にするため、ユーザーによるキー入力はカーソルを進めません)、カーソル位置を再度照会します。それはおそらく面倒であり、実際に努力する価値はありません。
/apps/gnome-terminal/profiles/Default/encoding
が文字列current
と等しい場合のエンコードを決定する問題に対処する半分の解決策があります。文字列current
がgnome-terminal
が現在のロケールを使用することを意味すると仮定します。
LANG
変数をチェックしてエンコードを決定するのは魅力的ですが、 this の質問によると、これは信頼できません。代わりに、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
エンコードを決定する問題に対処していないことに注意してください。