ロケール: 言語、地域の設定
- 日本語ロケールja_JP.UTF-8の設定
- localedefで追加
前提
- Dockerイメージ(
centos
,ubuntu
) (alpine
は非サポート)
ドキュメント
man locale
,man localedef
,man setlocale
- http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap07.html
ロケール
言語、地域慣例(金額・日時などの表示形式)の設定のこと。
ロケールごとの動作・表示
- Linux共通: 各プログラムの独自設定ではない
- 簡易: 環境変数での切り替え
例: dateコマンド
ロケール=日本語 タイムゾーン=日本標準時
2019年 5月 16日 木曜日 23:32:24 JST
ロケール=英語 タイムゾーン=協定世界時
Thu May 16 14:32:59 UTC 2019
タイムゾーンはロケールではなく、別途の設定。
設定の段階
システムレベル: デフォルト指定
- Linuxインストール時やその後
- 利用可能なロケール定義の追加
ユーザレベル: 優先
- 環境変数で指定: 利用可能なロケールの中から
- スタートアップファイル:
$HOME/.bash_rc
- 一時的変更:
変数=ロケール コマンド 引数
ロケールの指定書式
言語_国.文字コード
ロケール例
ja_JP.utf8
: 日本語、日本(文字コードはUTF-8
も同じ)en_US.utf8
: 英語、アメリカPOSIX
,C
POSIX
ロケールは未指定の場合のデフォルトロケールを意味し、C
としても同じ。いわばコンピュータのロケールで言語は英語のはず。
利用可能なロケール: localeコマンド
locale --all-locales
- これに出てこないものは定義の追加が必要
# Docker ubuntu:18.04
C
C.UTF-8
POSIX
# Docker centos:7
C
POSIX
en_AG
(略)
ロケール定義ファイル
定義ファイルをもとに、localedef
コマンドで、利用可能なロケールに追加する仕組み。
- 定義ファイルは通常、パッケージにあるもので足りる
- Ubuntu:
locales
パッケージ(ubuntuイメージでは個別インストール必要) - CentOS:
glibc-common
パッケージ
- Ubuntu:
- 定義ファイルの場所:
localedef --help
ロケール定義の追加: localedefコマンド
Dockerイメージ(ubuntu
やcentos
)にja_JP.utf8
がないため、定義に追加する。
localedef --charmap UTF-8 --inputfile ja_JP ja_JP.UTF-8
- 定義ファイルはパスではなく名前だけで指定できる
- Ubuntuは
locales
パッケージ必要
ロケール定義の追加: ubuntuイメージの場合
localedef
を(直接)使わない方法もある。
# /etc/locale.genのja_JP行のコメントをはずす
sed -i 's/# ja_JP.UTF-8 UTF-8/ja_JP.UTF-8 UTF-8/' /etc/locale.gen
# 定義追加
locale-gen
または、language-pack-ja
パッケージをインストールでもよい。
ロケールの適用
利用可能なロケールの中から選び、環境変数LANG
で指定する。
環境変数LANG: デフォルトのロケール
export LANG=ja_JP.UTF-8
環境変数LC_*: 個別用途
LC_
から始まるもの。未指定なら、LANG
の値が適用。
- 通貨:
LC_MONETARY
- 日時:
LC_TIME
- 他
例外は、(一時的な)上書き用のLC_ALL
で、他の個別の値より優先。
動作例
変数=ロケール コマンド
のように実行すると、その瞬間だけの値をコマンドに渡せる。
# LC_側があれば優先
LANG=C LC_TIME=ja_JP.utf8 date
2019年 5月 17日 金曜日 12:14:22 JST
# 空にすると、POSIXロケール
LANG= LC_TIME= LC_ALL= date
Fri May 17 12:14:44 JST 2019
# LC_ALLが最優先
LANG=ja_JP.utf8 LC_TIME=ja_JP.utf8 LC_ALL=C date
Fri May 17 12:20:53 JST 2019