次のページ 前のページ 目次へ

2. とりあえず "locale" とは何でしょう?

locale は、プログラムにハードコーディングすべきでない、言語や文化に特 有のいくつかのものを隠蔽します。

自分のコンピュータに複数の locale がインストールされているなら、下記の 環境変数によって locale を考慮するプログラムのふるまいを選択できます。 デフォルトの locale は C あるいは POSIX で、これは libc の中にハードコ ーディングされています。

LANG
   これは locale を設定しますが、他の LC_xxxx という環境変数によっ
   て上書きされます。

LC_COLLATE
   並べかえ(ソート)の順番です。

LC_CTYPE
   文字定義、大文字、小文字など。これらは toupper、tolower、
   islower、isdigit のような関数で用いられます。 [訳注:man 3
   isalpha 参照のこと。]

LC_MONETARY
   期待される形式で貨幣単位をフォーマットするのに必要な情報を含みま
   す。それは千の区切り文字、小数点区切り文字、通貨記号を意味するも
   のやその位置を定義します。

LC_NUMERIC
   期待される千、小数点区切り文字、数字集合です。

LC_TIME
   時刻、日付を指定する方法です。これは曜日、短縮形/非短縮形での月
   のようなものです。

LC_MESSAGES
   特に言うことはありません。

LC_ALL
   これは locale を設定し、他の LC_xxxx 環境変数に上書きされます。

いくつかの他の locale を示します。他にもたくさんあります。

en_CA
   English Canadian.

en_US
   US English.

de_DE
   Germany's German.

fr_FR
   France's French.

[訳注:日本語関係は ja,ja_JP,ja_JP.eucJP,ja_JP.SJIS,ja_JP.JIS7 等]

あなたがプログラムを書いていて、国際的に利用されることを望むなら、 locale を使うべきです。そのもっとも大きな理由は、誰もがあなたと同じ文 字セットやコードページを使おうとしているわけではないということです。

プログラムの中で以下のようなことをしないように。

/* check for alphabetic characters */
if ( (( c >= 'a') && ( c <= 'z' )) ||
     (( c >= 'A') && ( c <= 'Z' )) ) { ... }

もしこんなプログラムを書くなら、そのプログラムは、/user/file/... は ASCII で、ASCII 以外のなにものでもないことを仮定しており、ユーザの locale のコードページ定義を尊重していません。例えば、ドイツ語環境では a-ウムラウトのような文字で始まります。代わりに、isalpha() のような locale 依存関数を用いるべきです。もしプログラムがはっきりと US-ASCII アルファベットだけを使うことを要求している場合も、isalpha() 関数を用い ますが、その場合は、setlocale(LC_CTYPE,"C") を実行し、LANGLC_CTYPELC_ALL 環境変数を "C" に設定しなければ なりません。

locale を使えば非常に融通が効き、プログラマは ASCII ベースの C プログ ラムを書くときにしていたかもしれないある種の仮定ができなくなります。

たとえば、文字のコード位置を仮定することはできません。'A' のコード位置 を 0x41 ではなく 0xC1 に定義する charmap ファイルを 作ることを何ものも止めることはできません。これは実際にメインフレームで用い られる IBM コードページ 37 で、'A' のコード位置マッピング です。一方前者は、 US-ASCII、iso8859-x などで用いられています。

基本的な考えは、異なる人々が異なる言語を話し、異なる並べかえ順を想定 し、異なるコードページを用い、異なる国に住んでいることです。locale と locale に依存するプログラムはそれを尊重し、それに応じた扱いをするよう に意図されています。そうするのに格別の努力はいりませんし、プログラムを 書くときにちょっと気分を変えるだけでよいのです。


次のページ 前のページ 目次へ