web-dev-qa-db-ja.com

UTF-8のロケールで使用する適切なエンコーディング名は何ですか?

このCentOS7システムと同じように、ここで疑問に思っています。

$ locale -a 
<snip>
en_US.utf8
<snip>

それでも:

$ localectl 
System Locale: LANG=en_US.UTF-8

これに加えて、X11(/usr/share/X11/locale/locale.dir)による優先名は次のとおりです。

$ grep 'en_US.UTF-8$' /usr/share/X11/locale/locale.dir 
en_US.UTF-8/XLC_LOCALE                  en_US.UTF-8
en_US.UTF-8/XLC_LOCALE:                 en_US.UTF-8

En_US.utf8には幸運なことに、エイリアスがあります。

$ grep 'en_US.utf8' /usr/share/X11/locale/locale.alias
en_US.utf8                                      en_US.UTF-8
en_US.utf8:                                     en_US.UTF-8

他のいくつかはそれほど幸運ではありません、例えば。 ru_UA.utf8:

$ locale -a | grep ru_UA.utf8
ru_UA.utf8
$ grep 'ru_UA.utf8' /usr/share/X11/locale/locale.alias
$ grep 'ru_UA.UTF-8' /usr/share/X11/locale/locale.dir
en_US.UTF-8/XLC_LOCALE                  ru_UA.UTF-8
en_US.UTF-8/XLC_LOCALE:                 ru_UA.UTF-8

選択したロケールがX11ロケールにない場合、これがやや煩わしい理由は、GDM(またはgnome-session?)が「utf8」バージョンの使用を強制し、次のようなメッセージでXプログラムを中断するためです。「警告:ロケールではありません。 Xlibでサポートされ、ロケールはC "に設定されています。 I could /usr/share/X11/locale/locale.aliasを編集するだけですが、実際に正しいバージョンについての詳細があればいいのですが。

9
lmz

GNU libcソース(intl/l10nflist.c:_nl_normalize_codeset)状態のコメント:

コードセット名の標準はありません。

コードセット名は、その関数によってすべて小文字に正規化され、英数字以外のすべての文字が削除されます。つまり、「UTF-8」は「utf8」に変わります。

ロケールアーカイブ内のロケール名は、正規化されたコードセット名を使用しています。

標準がないため、GDMは「utf8」を使用する権利の範囲内であり、「ru_UA.utf8」のようなロケールは 無効 ではありません。 「utf8」は好ましくないかもしれませんが、正規化された形式であるため、(少なくともlibc標準では)間違いなく受け入れられます。

5
lmz