web-dev-qa-db-ja.com

現在のロケールがUTF-8エンコーディングを使用しているかどうかを確認する方法は?

ユーザーのロケールがUTF-8エンコーディングを使用しているかどうかを確認したいと思います。

これは少し見苦しいようです:

[[ $LANG =~ UTF-8$ ]] && echo "Uses UTF-8 encoding.."

より一般的/ポータブルな方法はありますか?

4
Håkon Hægland

Wikipedia から:

POSIXプラットフォームでは、ロケール識別子は言語タグのBCP 47定義と同様に定義されますが、ロケールバリアント修飾子は別の方法で定義され、文字エンコーディングは識別子の一部として含まれます。

これは、[language [_territory] ​​[。codeset] [@ modifier]]の形式で定義されています。 (たとえば、UTF-8エンコーディングを使用するオーストラリア英語はen_AU.UTF-8です。)

ただし、たとえば[en_AGthis 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 のラッパーです。

5
Håkon Hægland

POSIXシステムでは、 locale を使用できます。

$ if (locale | grep -e 'utf8' -e 'UTF-8') >/dev/null 2>&1; then echo UTF8; fi
UTF8
5
cuonglm

LC_CTYPEロケールカテゴリには、これに使用できるcharmap属性があります。

locale -k LC_CTYPE | grep -qi 'charmap="utf-\+8"' && echo "Uses UTF-8 encoding.."

ロケール名を解析する方が少し堅牢です。

4
jan

ロケール文字列に小文字のutf8サブ文字列が含まれている場合に対処するには、bashnocasematchオプションを設定して、ダッシュをオプションにします。

shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."
1
kos