web-dev-qa-db-ja.com

現在の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-10に変更されていません。したがって、gconftoolは現在のエンコーディングを決定するために使用できないようです。

3
Håkon Hægland

locale charmapの出力($ LANG、$ LC_CTYPE、$ LC_ALLで設定された値を報告する)を確認することをお勧めします。これは端末に直接クエリを送信しませんが、ほとんどのアプリケーションではロケールが端末と一貫して正しく設定されていることが重要です。実際の動作以外の何かを報告する場合、アプリだけでなく、他のほとんどすべてのアプリがターミナルで誤動作し、それはあなたのせいではありません。もちろん、ユーザーはメニューからエンコードを変更できますが、自分で足を撃つことに決めた場合、あなたができる/すべきでないことはあまりありません。障害のあるシステム全体の設定を検出するのはあなたの仕事ではありません。また、アプリの実行中にユーザーがエンコードを切り替えるかどうかに気付く方法がないため、起動時に検証することはあまり意味がないと思います。

本当に実行時の動作を確認する必要がある場合は、カーソル位置を照会するエスケープシーケンスを送信し(キーボードから入力されたかのように特定の形式で報告する)、その後、いくつかのバイトを送信できます。 UTF-8で単一の文字を形成し、他のエンコーディングでは複数の文字を形成し(その間ローカルエコーを無効にするため、ユーザーによるキー入力はカーソルを進めません)、カーソル位置を再度照会します。それはおそらく面倒であり、実際に努力する価値はありません。

2
egmont

/apps/gnome-terminal/profiles/Default/encodingが文字列currentと等しい場合のエンコードを決定する問題に対処する半分の解決策があります。文字列currentgnome-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エンコードを決定する問題に対処していないことに注意してください。

1
Håkon Hægland