ユーザーのロケールが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
ができます。bash
nocasematch
shopt -s nocasematch
[[ $LANG =~ UTF-?8$ ]] && echo "Uses UTF-8 encoding.."