ローカライゼーションと国際化

June 05, 2018

ロケール

多くのソフトウェアは利用者の地域情報 (ロケール) に従って表示言語や表示書式を変更できるように作られている。
ロケールは、メッセージの出力言語 (LCMESSAGES) や通貨 (LCMONETARY) などのカテゴリに分かれており、すべてのカテゴリに同じ値を設定するときは、環境変数 LANG または LC_ALL に設定する。
主なカテゴリは以下。

カテゴリ 説明
LC_CTYPE 文字の種類やその比較* 分類の規定
LC_COLLATE 文字の称号や整列に関する規定
LC_MESSAGES メッセージ表示に使用する言語
LC_MONETARY 通貨に関する規定
LC_NUMERIC 数値の書式に関する規定
LC_TIME 日付や時刻の書式に関する規定

これらのカテゴリは個々に別々の値を設定することができる。
主なロケールの値は以下。

ロケール 説明
C, POSIX 英語
jaJP.utf8 (jaJP.UTF-8) 日本語/Unicode
ja_JP.eucJP 日本語/EUC-JP
ja_JP.shiftJIS 日本語/シフトJIS
en_US.utf8 英語/Unicode

locale コマンドにより現在のロケールを確認可能。

$ locale  
LANG=en_US.UTF-8  
LC_CTYPE="en_US.UTF-8"  
LC_NUMERIC=ja_JP.UTF-8  
LC_TIME=ja_JP.UTF-8  
LC_COLLATE="en_US.UTF-8"  
LC_MONETARY=ja_JP.UTF-8  
LC_MESSAGES="en_US.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=  
  
$ LANG=ja_JP.UTF-8   
$ 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=  
$ ls a  
ls: a にアクセスできません: そのようなファイルやディレクトリはありません  

文字コード

Linux は様々な文字コードを扱うことができる。

文字コード 説明
ASCII 7 bit で表現される基本的な 128 種類の文字
ISO-8859 ASCII を拡張した 8 bit の文字コードで 256 種類の文字
UTF-8 Unicode を使った文字コードで、1 文字を 1 byte ~ 6 bytes で表す
EUC-JP UNIX 環境で標準的に利用されていた日本語の文字コード
ShiftJIS Windows で利用される日本語の文字コード
ISO-2022-JP 電子メールなどで利用される日本語の文字コード(JIS コード)

現在、多くのディストリビューションでは UTF-8 を使用しているが、日本ではいくつかの文字コードが混在しているので、例えば Windows で作成したファイルを Linux で開くと文字化けする。
文字コードを変換する場合は iconv コマンドを用いる。

$ iconv -f utf8 -t eucjp testfile.txt > testfile-eucjp.txt  

また、指定可能な文字コードは -l オプションで調べることができる。

$ iconv -l   
The following list contain all the coded character sets known.  This does  
not necessarily mean that all combinations of these names can be used for  
the FROM and TO command line parameters.  One coded character set can be  
listed with several different names (aliases).  
  
  437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,  
  866, 866NAV, 869, 874, 904, 1026, 1046, 1047, 8859_1, 8859_2, 8859_3, 8859_4,  
  8859_5, 8859_6, 8859_7, 8859_8, 8859_9, 10646-1:1993, 10646-1:1993/UCS4,  
  ANSI_X3.4-1968, ANSI_X3.4-1986, ANSI_X3.4, ANSI_X3.110-1983, ANSI_X3.110,  
  ARABIC, ARABIC7, ARMSCII-8, ASCII, ASMO-708, ASMO_449, BALTIC, BIG-5,  

タイムゾーン

タイムゾーンの情報は /usr/share/zoneinfo ディレクトリ以下のバイナリファイルに格納されている。

$ ls -l /usr/share/zoneinfo/ | head -10  
total 416  
drwxr-xr-x  2 root root   4096  413 00:08 Africa  
drwxr-xr-x  6 root root   4096  413 00:08 America  
drwxr-xr-x  2 root root   4096  413 00:08 Antarctica  
drwxr-xr-x  2 root root   4096  413 00:08 Arctic  
drwxr-xr-x  2 root root   4096  413 00:08 Asia  
drwxr-xr-x  2 root root   4096  413 00:08 Atlantic  
drwxr-xr-x  2 root root   4096  413 00:08 Australia  
drwxr-xr-x  2 root root   4096  413 00:08 Brazil  
-rw-r--r--  1 root root   2102  44 18:59 CET  

システムで利用するタイムゾーンは、上記のファイルを /etc/localtime にコピーすれば良い。
日本は /usr/share/zoneinfo/Asia/Tokyo なので、以下のコマンドを実行する。(cp でも良い)

$ sudo ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime   
$ ls -l /etc/localtime   
lrwxrwxrwx 1 root root 30  65 17:36 /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo  
$ date  
201865日 火曜日 17:37:19 JST  

また、タイムゾーンは環境変数 TZ で設定することもできる。

$ export TZ="Asia/Tokyo"  

この値を全ユーザーで利用するには /etc/timezone ファイルに Asia/Tokyo と設定する必要がある。
tzselect コマンドでタイムゾーンの設定値を確認可能。

$ tzselect  
Please identify a location so that time zone rules can be set correctly.  
Please select a continent or ocean.  
 1) Africa  
 2) Americas  
 3) Antarctica  
 4) Arctic Ocean  
 5) Asia  
 6) Atlantic Ocean  
 7) Australia  
 8) Europe  
 9) Indian Ocean  
10) Pacific Ocean  
11) none - I want to specify the time zone using the Posix TZ format.  

 © 2023, Dealing with Ambiguity