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
答え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
。