ユーザーのロケールがUTF-8エンコーディングを使用しているかどうかを確認したいと思います。
これは少し見苦しいようです:
[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."
より一般的/ポータブルな方法はありますか?
Wikipedia から:
POSIXプラットフォームでは、ロケール識別子は言語タグのBCP 47定義と同様に定義されますが、ロケールバリアント修飾子は別の方法で定義され、文字エンコーディングは識別子の一部として含まれます。
これは、[language [_territory] [。codeset] [@ modifier]]の形式で定義されています。 (たとえば、UTF-8エンコーディングを使用するオーストラリア英語はen_AU.UTF-8です。)
ただし、たとえば[en_AG
( this questionを参照)などのように、ロケール識別子にコードセットサフィックスがない場合、コードセットはそのロケールのデフォルト設定によって定義されます。よくUTF-8である。その結果、現在のエンコーディングはLANG環境変数を調べても判別できません。
さらに、locale
コマンドは環境変数の現在の値のみを表示します。そのため、このコマンドを使用してコードセットを決定することもできないようです。
ただし、Perlモジュール I18N::Langinfo
があります。これも参照してください question 解決策のようです:
Perl -MI18N::Langinfo=langinfo,CODESET -E 'say "Uses UTF-8 encoding .." if langinfo(CODESET()) eq "UTF-8"'
このPerlモジュールは、Cライブラリ関数 nl_langinfo のラッパーです。
POSIXシステムでは、 locale を使用できます。
$ if (locale | grep -e 'utf8' -e 'UTF-8') >/dev/null 2>&1; then echo UTF8; fi
UTF8
LC_CTYPEロケールカテゴリには、これに使用できるcharmap
属性があります。
locale -k LC_CTYPE | grep -qi 'charmap="utf-\+8"' && echo "Uses UTF-8 encoding.."
ロケール名を解析する方が少し堅牢です。
ロケール文字列に小文字のutf8
サブ文字列が含まれている場合に対処するには、bash
のnocasematch
オプションを設定して、ダッシュをオプションにします。
shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."