locale(7) 多言語サポートの解説

書式


#include <locale.h>

説明

ロケール (locale) は言語や文化ルールの集合である。 これには、メッセージ出力に使用する言語、 様々な文字集合、 表記に関する慣習などが含まれる。 プログラムをいろいろな文化に移植可能とするには、 プログラムが自分のロケールを判定し、 それに応じた適切な動作ができる必要がある。

ヘッダーファイル <locale.h> には、 このための便利なデータ型、 関数、 マクロなどの宣言がある。

このヘッダーファイルで宣言されている関数には、 現在のロケールを設定する setlocale(3) と、数値のフォーマット方法についての情報を取得する localeconv(3) がある。

ロケール情報は、 プログラムが必要とすると思われるいくつかのカテゴリに分かれており、 それらはマクロとして宣言されている。 これらのマクロを setlocale(3) 関数の最初の引き数に用いると、 各カテゴリを望むロケールに設定できる。

LC_ADDRESS (GNU 拡張、 glibc 2.2 以降)
場所や地理関連の項目の表示に使用するフォーマット (郵便番号など) に関する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素を取得できる。 _NL_ADDRESS_COUNTRY_NAME (指定されたロケールの言語での国名) や _NL_ADDRESS_LANG_NAME (指定されたロケールの言語での言語名) などがあり、 ドイツ語ロケールでは "Deutschland" と "Deutsch" といった文字列が返される。 他の要素名については <langinfo.h> にリストがある。
LC_COLLATE
これは地域的なアルファベット文字列の比較に使用する strcoll(3) 関数と strxfrm(3) 関数の動作を変更する。例えばドイツ語のエスツェット (鋭い s) は、ソートの際 "ss" として扱われる。
LC_CTYPE
これは isupper(3) や toupper(3) のような文字の判定・操作をする関数や、多バイト文字を扱う mblen(3) や wctomb(3) のような関数の動作を変更する。
LC_IDENTIFICATION (GNU 拡張、 glibc 2.2 以降)
ロケールのメタデータに関連する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素を取得できる。 _NL_IDENTIFICATION_TITLE (このロケール文書のタイトル) や _NL_IDENTIFICATION_TERRITORY (このロケール文書が適用される地理的な範囲) などがあり、 "English locale for the USA" や "USA" といった文字列が返される。 他の要素名については <langinfo.h> にリストがある。
LC_MONETARY
localeconv(3) によって返される情報を変更する。 これには小数点や区切りコンマの位置など、 数字の表示方法に関する詳細が含まれている。この情報は strfmon(3) 関数が内部で使用する。
LC_MESSAGES
メッセージ表示に使用する言語を変更する。 また肯定的・否定的な回答をどのように表示するかを変更する。 この情報を簡単に使用するために、 GNU C ライブラリには gettext(3), ngettext(3), rpmatch(3) 関数が含まれている。 GNU gettext ファミリーに属する関数は、カテゴリが "C" 以外の有効なロケールに設定されている場合、環境変数 LANGUAGE にも従う (LANGUAGE はコロン区切りのロケールのリストである)。
LC_MEASUREMENT (GNU 拡張、 glibc 2.2 以降)
ロケールの測定系 (つまり、メートル法かアメリカでよく使われる単位か) に関連する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素である _NL_MEASUREMENT_MEASUREMENT を取得できる。 この要素は 1 (メートル法) か 2 (アメリカでよく使われる単位) の値が入った文字列へのポインタを返す。
LC_NAME (GNU 拡張、 glibc 2.2 以降)
人に呼びかける際に使用されるフォーマットに関する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素を取得できる。 _NL_NAME_NAME_MR (男性に対する一般的な呼び掛け) や _NL_NAME_NAME_MS (女性に対する一般的な呼び掛け) などがあり、 ドイツ語ロケールでは "Herr" や "Frau" といった文字列が返される。 他の要素名については <langinfo.h> にリストがある。
LC_NUMERIC
printf(3) 関数および scanf(3) 関数のファミリーでロケール設定を使うよう指示された場合に 用いる情報を変更する。この情報は localeconv(3) 関数で取得することもできる。
LC_PAPER (GNU 拡張、 glibc 2.2 以降)
標準的な紙のサイズの寸法 (US letter や A4 など) に関する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素である _NL_PAPER_WIDTH_NL_PAPER_HEIGHT を取得できる。 この要素はミリメーター単位の寸法を指定する int 値を返す。
LC_TELEPHONE (GNU 拡張、 glibc 2.2 以降)
電話サービスで使用されるフォーマットに関する設定を変更する。 この情報が必要なアプリケーションは nl_langinfo(3) を使って非標準の要素を取得できる。 _NL_TELEPHONE_INT_PREFIX (そのロケールでの電話番号の前に付く国を示す番号) などがある。 "49" (ドイツの場合) といった文字列が返される。 他の要素名については <langinfo.h> にリストがある。
LC_TIME
strftime(3) 関数の動作を変更し、 地域で利用されている方法で現在時刻を表示する。 例えば、ヨーロッパの多くでは 24時間式の時計を使うが、 アメリカでは 12時間式の時計を使う。
LC_ALL
上記の全て。

setlocale(3) の二番目の引き数が空文字列 "" の場合、 デフォルトのロケールは以下の手順で決定する:

1.
環境変数 LC_ALL が設定されている場合には LC_ALL の値が使用される。
2.
上記のカテゴリのどれかと同じ名前の環境変数が設定されている場合には、 そのカテゴリにはその値が使用される。
3.
環境変数 LANG が設定されている場合には LANG の値が使用される。

地域的な数値フォーマットの情報は localeconv(3) 関数によって返される struct lconv で得ることができ、これは以下のように宣言されている:

struct lconv {
    /* (通貨以外の) 数値情報 */
    char *decimal_point;     /* 小数点の文字 */
    char *thousands_sep;     /* 小数点の左側の数字のグループの
                                区切り文字 */
    char *grouping; /* それぞれの要素は各グループの数字の個数である。
                       インデックス値が大きいほど、左側のグループを表す。
                       要素の値が CHAR_MAX の場合は、最後のグループで
                       あることを意味する。要素の値が 0 の場合は、
                       その要素より左側の全ての要素に前の要素と同じ値を
                       使用することを意味する。 */
    /* 残りのフィールドは通貨情報用である */
    char *int_curr_symbol;   /* 最初の三つの文字は ISO 4217 の通貨記号。
                                四番目の文字は区切り文字。
                                五番目は ' '。 */
    char *currency_symbol;   /* 地域の通貨記号 */
    char *mon_decimal_point; /* 小数点の文字 */
    char *mon_thousands_sep; /* 上記の `thousands_sep' と同様 */
    char *mon_grouping;      /* 上記の `grouping' と同様 */
    char *positive_sign;     /* 正の値の符号 */
    char *negative_sign;     /* 負の値の符号 */
    char  int_frac_digits;   /* 国際的な小数部の数字 */
    char  frac_digits;       /* 地域の小数部の数字 */
    char  p_cs_precedes;     /* 正の値の前に通貨記号を置く場合は 1,
                                後ろに置く場合は 0 */
    char  p_sep_by_space;    /* 正の値と通貨記号の間にスペースを
                                入れる場合は 1 */
    char  n_cs_precedes;     /* 負の値の前に通貨記号を置く場合は 1,
                                後ろに置く場合は 0 */
    char  n_sep_by_space;    /* 負の値と通貨記号の間にスペースを
                                入れる場合は 1 */
    /* 正と負の符号の位置:
       0 値と通貨記号を括弧で囲む
       1 符号は値と通貨記号の前に置く
       2 符号は値と通貨記号の後に置く
       3 符号は通貨記号の直後に置く
       4 符号は通貨記号の直前に置く    */
    char  p_sign_posn;
    char  n_sign_posn;
};

ロケール API の POSIX.1-2008 での拡張

POSIX.1-2008 では、 ロケール API への多くの拡張が標準化されている。 これは GNU C ライブラリのバージョン 2.3 で初めて登場した実装に基づいている。 これらの拡張は、 従来のロケール API がマルチスレッドアプリケーションや複数のロケールを扱う必要があるアプリケーションとうまく組み合わせて使うことができない問題を解決するために設計された。

この拡張は、 ロケールオブジェクトの作成、操作のための新しい関数 (newlocale(3), freelocale(3), duplocale(3), uselocale(3)) とサフィックス "_l" が付いた新しいライブラリ関数 (toupper_l(3) など) で構成される。 新しいライブラリ関数は、 従来のロケール依存の API (toupper(3) など) を関数実行時に適用するロケールオブジェクトの指定ができるように拡張したものである。

準拠

POSIX.1-2001.

この文書について

この man ページは Linux man-pages プロジェクトのリリース 3.65 の一部 である。プロジェクトの説明とバグ報告に関する情報は http://www.kernel.org/doc/man-pages/ に書かれている。