変更要約: 初版(主題1.08・副主題1.08.1〜1.08.3に対応)
3.3ローカライゼーションと国際化
言語・地域設定の仕組みを学びます。国際化(i18n)とローカライゼーション(l10n)の違い、ロケールと環境変数(LANG・LC_ALL・LC_*)、locale コマンド、文字コード(ASCII・Unicode・UTF-8・ISO-8859・ISO-2022-JP)とiconv による変換、スクリプトで LANG=C が役立つ理由を押さえます。
「日本語のはずが文字化けする」「ソートの結果が環境で違う」——原因はたいていロケールか文字コードです。日本語環境の管理者にとっては実害が身近なだけに、仕組みから理解しておくと強いテーマです。
3.3.1ロケールと環境変数
- 国際化(i18n)=ソフトを多言語対応できる作りにすること/ローカライゼーション(l10n)=特定の言語・地域に合わせ込むこと。
- ロケール=言語・地域・文字コードの組(
ja_JP.UTF-8=日本語/日本/UTF-8)。現在値の確認=locale コマンド・利用可能一覧=locale -a。 - 優先順位=LC_ALL(全カテゴリを強制上書き)> LC_*(LC_TIME・LC_COLLATE 等の個別カテゴリ)> LANG(既定値)。
- LANG=C(POSIX ロケール)=メッセージが英語・ソートがバイト順になる基準環境。スクリプトでコマンド出力を parse するときは LANG=C にして、翻訳による出力差を排除するのが定石。
3.3.2文字コードと iconv
- ASCII=英数字と記号の7ビット基本セット/ISO-8859=欧州言語向けの8ビット拡張群/Unicode=全世界の文字に番号を割り当てる規格で、その代表的な符号化が UTF-8(ASCII 互換・現在の Linux 標準)。
- ISO-2022-JP=日本語メールで伝統的に使われる7ビット符号化(JIS)。
- iconv=文字コード変換(
iconv -f SHIFT_JIS -t UTF-8 old.csv > new.csv=-f 変換元・-t 変換先)。対応一覧はiconv -l。
「LC_ALL > LC_* > LANG の優先順位」「スクリプトの出力 parse には LANG=C」「iconv -f 元 -t 先」 が3大頻出です。「UTF-8 は Unicode の符号化方式のひとつ(Unicode=符号化方式そのものではない)」という規格と符号化の区別も選択肢で問われます。
なぜ LANG=C が「スクリプトの保険」になるのかを具体で見ましょう。df -h の出力見出しは、日本語ロケールでは「使用%」、英語では「Use%」——grep や awk での抜き出しがロケール次第で壊れるわけです。スクリプト冒頭(またはコマンド単位で LANG=C df -h)で C ロケールに固定すれば、どのサーバーでも同じ英語出力・同じバイト順ソートが保証されます。もうひとつの実務定番が文字化けファイルの救出です。Windows から届いた Shift_JIS の CSV が Linux(UTF-8 前提)で化けたら、iconv -f SHIFT_JIS -t UTF-8 受領.csv > 変換済.csv で正規化します。優先順位の実験は LC_TIME=C date と LC_ALL=ja_JP.UTF-8 LC_TIME=C date を見比べるのが早く、後者では LC_ALL が LC_TIME を握りつぶして日本語表示になります——「LC_ALL は個別設定をすべて上書きする」を体で覚えられる例です。
| 変数/規格 | 役割 | 要点 |
|---|---|---|
| LANG | ロケールの既定値 | 個別 LC_* が無い部分に適用 |
| LC_ALL | 全カテゴリ強制上書き | 最優先(デバッグ・固定用) |
| LANG=C | POSIX 基準環境 | スクリプトの出力を安定化 |
| UTF-8 | Unicode の符号化方式 | ASCII 互換・Linux 標準 |
ひっかけ: 「LANG は LC_ALL より優先される」は誤りです。優先順位は LC_ALL > LC_* > LANG で、LANG は最後の既定値です。また「iconv はファイルのロケールを変更するコマンド」も誤り=iconv が変換するのは文字コード(テキストの中身)で、ロケール(環境変数)とは別物です。「Unicode と UTF-8 は同じもの」も不正確=UTF-8 は Unicode の符号化方式のひとつです。
3.3.3この節のまとめ
- 優先度 LC_ALL>LC_*>LANG・確認は locale(-a)。スクリプトの parse は LANG=C で固定
- UTF-8=Unicode の符号化(Linux 標準)・メールの伝統は ISO-2022-JP。変換は iconv -f 元 -t 先
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. ロケール関連の環境変数の優先順位として正しいのはどれ?
Q2. コマンド出力を grep で解析するスクリプトが、日本語環境のサーバーでだけ動かない。出力を環境非依存にする定石はどれ?
Q3. Windows から受け取った Shift_JIS の CSV ファイルを UTF-8 に変換したい。適切なコマンドは?

