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

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

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

これは少し醜いようです。

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

より一般的で移植可能な方法はありますか?

答え1

~からウィキペディア:

POSIXプラットフォームでは、ロケール識別子の定義は、ロケールバリアント修飾子の定義が異なり、文字エンコーディングが識別子に含まれることを除いて、言語タグのBCP 47定義と似ています。

定義形式は[言語[_territory][.codeset][@modifier]]です。 (たとえば、UTF-8でエンコードされたオーストラリア英語はen_AU.UTF-8です。)

ただし、たとえば、ロケール識別子にコードセットのサフィックスがない場合en_AG(参照これ質問)、コードセットはそのロケールのデフォルト設定(ほとんどUTF-8)によって定義されます。したがって、LANG 環境変数をチェックして現在のエンコーディングを確認することはできません。

また、このlocaleコマンドは環境変数の現在の値のみを表示するため、このため、コードセットを決定するためにもコマンドを使用できないようです。

しかし、Perlモジュールがあります。I18N::Langinfo、これも参照してください質問これが解決策のようです:

perl -MI18N::Langinfo=langinfo,CODESET -E 'say "Uses UTF-8 encoding .." if langinfo(CODESET()) eq "UTF-8"'

このPerlモジュールはCライブラリ関数を取り囲むラッパーです。nl_言語情報

答え2

LC_CTYPE ロケールカテゴリの属性は、charmap次の目的で使用できます。

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

ロケール名の解析がより強力になりました。

(ブルーホーンの提案に基づいて回答が更新されました。ありがとうございます!)

答え3

POSIXシステムでは、次のものを使用できます。ロケール:

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

答え4

ロケール文字列に小文字の部分文字列が含まれている場合を処理するには、 'sオプションを設定してダッシュをオプションにすることutf8ができます。bashnocasematch

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

関連情報