Linux
locale
POSIX

ロケール(locale)まとめ

情報源

Archのwikiがとてもよくまとまっている。
man 5 localeman 7 localeにも情報がある。
基本的にロケールはlibcの機能だと知っていると理解が進むと思う。

現在のロケール設定を確認するにはlocaleコマンド

# locale                        
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

システムにインストールされているロケールの一覧を確認するにはlocale -a

# locale -a
C
POSIX
ja_JP.utf8

またはlocaledef --list-archive -v

システムに使いたいロケールがインストールされていない場合

自分でロケールのソースからコンパイルすればよい。やり方はディストリビューションによって異なるが、locale-genコマンドがある場合はそれを使う。
locale-genはシェルスクリプトになっていて、内部で

localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8

に相当することをやっている。

環境変数の意味と優先順位

環境変数 意味
LC_CTYPE 文字の分類および大文字/小文字の変換。
LC_NUMERIC 小数区切り文字 (または基数文字)、千の区切り文字、およびグループ化を指定します。
LC_TIME 月の名前、曜日、一般的な完全表示や短縮表示など、日付や時刻の書式を指定します。
LC_MONETARY ロケールの通貨記号、千の区切り文字、符号の位置、小数点以下の桁数など、通貨の書式を指定します。
LC_COLLATE ロケールの照合順序および正規表現の定義を指定します。
LC_MESSAGES ロケールのローカライズメッセージの記述言語、および肯定と否定の応答 (yes と no の文字列と表現) を指定します。

以上の6個はPOSIXで定義されているもの。それ以外のLC_PAPERなどはGNU C libraryの独自拡張、とman 5 localeに書いてあった。

LANG < LC_CTYPE, LC_MESSAGE等 < LC_ALL

右に行くほど優先される。
~/.bash_profileではLANGだけ設定しておけば十分。もし必要ならLC_CTYPEなどを個別に設定、さらにそれらを全て(一時的に)上書きしたい場合にLC_ALLを使う。
シェルスクリプト内で必ずCロケールにしてsortコマンドなどを使いたい場合はLC_ALL=Cを使うと良い。

ファイルとディレクトリの配置(Arch Linuxの場合)

ファイル 説明
/etc/locale.gen 生成すべきロケールの一覧。これは手で編集する
/usr/bin/localedef ロケールをコンパイルするプログラム。glibcの一部なので、CentOS等にも入っている
/usr/bin/locale-gen /etc/locale.genで定義された各ロケールに対してlocaledefを呼び出すシェルスクリプト
/usr/share/i18n/locales/ localedefでコンパイルする入力ファイルが置かれる
/usr/lib/locale/locale-archive localedefでコンパイルされたロケールの実体
/usr/share/locale/ gettextで使用する翻訳ファイル(*.mo)が置かれる