setlocale() — ロケールの設定

フォーマット

#include <locale.h>
char *setlocale(int category, const char *locale);

言語レベル: ANSI

スレッド・セーフ: いいえ。

ロケール依存: 詳細については、CCSID およびロケールの理解を参照してください。

説明

setlocale() 関数は、<locale.h> インクルード・ファイルで定義された、 ロケーションを示す変数を変更または照会します。 以下に、category の値をリストします。

カテゴリー 目的
LC_ALL プログラムのロケール全体を指定します。
LC_COLLATE strcoll() および strxfrm() 関数の振る舞いに影響を与えます。
LC_CTYPE 文字処理関数の振る舞いに影響を与えます。
LC_MONETARY localeconv() および nl_langinfo() 関数によって戻される通貨情報に影響を与えます。
LC_NUMERIC 以下のような定様式入出力の小数点文字およびストリング変換関数、 ならびに localeconv() および nl_langinfo() 関数によって戻される非通貨フォーマット設定情報に影響を与えます。
LC_TIME strftime() 関数の振る舞い、および nl_langinfo() 関数によって戻される時刻形式設定情報に影響を与えます。
LC_TOD 時間関数の振る舞いに影響を与えます。

カテゴリー LC_TOD には、複数のフィールドがあります。 TNAME フィールドは時間帯名です。 TZDIFF フィールドは、地方時とグリニッジ標準時との差です。 TNAME フィールドが非ブランクの場合、 一部の時間関数によって戻された値を判別する際に TZDIFF フィールドが使用されます。 この値は、システム値 QUTCOFFSET に優先します。

LC_UNI_ALL* このカテゴリーによって、setlocale() は指定されたロケールからすべての LC_UNI_ カテゴリーをロードします。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_COLLATE* wcscoll() および wcsxfrm() 関数の振る舞いに影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
注:
このカテゴリーは、UCS-2 ではサポートされません。
LC_UNI_CTYPE* ワイド文字処理関数の振る舞いに影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_MESSAGES* _WCS_nl_langinfo() 関数によって戻されるメッセージ・フォーマット設定情報に影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_MONETARY* wcslocaleconv() および _WCS_nl_langinfo() 関数によって戻される通貨情報に影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_NUMERIC* 以下のようなワイド文字定様式入出力の小数点文字およびワイド文字ストリング変換関数、 ならびに wcslocaleconv() および _WCS_nl_langinfo() 関数によって戻される非通貨フォーマット設定情報に影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_TIME* wcsftime() 関数の振る舞い、および _WCS_nl_langinfo() 関数によって戻される時刻形式情報に影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
LC_UNI_TOD* ワイド文字時間関数の振る舞いに影響を与えます。 このカテゴリーは、UCS-2 または UTF-32 の CCSID のロケールのみを受け入れます。
*
名前にカテゴリーと UNI を使用するには、 コンパイル・コマンドで LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) を指定する必要があります。 LOCALETYPE(*LOCALEUCS2) を使用する場合、指定されたロケールは UCS-2 ロケールでなければなりません。 LOCALETYPE(*LOCALEUTF) を使用する場合、指定されたロケールは UTF-32 ロケールでなければなりません。
注:
System i® プラットフォームで setlocale() とその他のロケール依存 C 関数を定義する場合は、 2 とおりの方法があります。 setlocale() を定義する 1 つ目の方法は、*CLD ロケール・オブジェクトを使用してロケールを設定し、 ロケール依存データを検索するという方法です。 setlocale() を定義する 2 つ目の方法は、*LOCALE オブジェクトを使用してロケールを設定し、 ロケール依存データを検索するという方法です。 元の方法には、コンパイル・コマンドで LOCALETYPE(*CLD) を指定してアクセスします。 2 番目の方法には、コンパイル・コマンドで LOCALETYPE(*LOCALE)、LOCALETYPE(*LOCALEUCS2)、 または LOCALETYPE(*LOCALEUTF) を指定してアクセスします。 ILE C でのロケール定義における 2 つの方法についての詳細は、 「IBM Rational Development Studio for i: ILE C/C++ Programmer's Guide」の『International Locale Support』のセクションを参照してください。

*CLD ロケール・オブジェクトを使用した Setlocale

locale の値は、"C"、""、LC_C、 LC_C_GERMANY、LC_C_FRANCE、LC_C_SPAIN、 LC_C_ITALY、LC_C_USA または LC_C_UK に設定できます。 locale 値 "C" は、デフォルトの C 環境を示します。 locale 値 "" は、 setlocale() 関数での実装にデフォルト・ロケールを使用することを示します。

*LOCALE オブジェクトによる Setlocale

locale の値は、""、"C"、"POSIX"、または *LOCALE オブジェクトの完全修飾された統合ファイル・システム・パス名 (二重引用符で囲む) に設定できます。locale 値 "C" または "POSIX" は、デフォルトの C *LOCALE オブジェクトを示します。 locale 値 "" は、 setlocale() 関数でプロセスにデフォルト・ロケールを使用することを示します。

プロセスのデフォルト・ロケールは、次の表を使用して決定します。

LC_ALL
  1. LC_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、 すべての POSIX ロケール・カテゴリーに、指定されたロケール2 を使用します。 それ以外の場合は、次のステップに進みます。
  2. 各 POSIX ロケール・カテゴリー (LC_CTYPE、LC_COLLATE、LC_TIME、LC_NUMERIC、 LC_MESSAGES、LC_MONETARY、および LC_TOD) について、同じ名前1 を持つ環境変数を確認します。 この環境変数が定義済みで非ヌルの場合は、 指定されたロケール2 を使用します。
  3. LANG 環境変数1 を確認します。 前のステップで設定されなかった各ロケール・カテゴリーごとに、 LANG 環境変数が定義済みで非ヌルの場合は、ロケール・カテゴリーを指定されたロケール2 に設定します。 それ以外の場合は、それをデフォルトの C *LOCALE オブジェクトに設定します。
LC_CTYPE
LC_COLLATE
LC_TIME
LC_NUMERIC
LC_MESSAGES
LC_MONETARY
LC_TOD
  1. LC_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケール2 を使用します。 それ以外の場合は、次のステップに進みます。
  2. 指定されたロケール・カテゴリーと同じ名前を持つ環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、 指定されたロケール2 を使用します。 それ以外の場合は、次のステップに進みます。
  3. LANG 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、ロケール・カテゴリーを指定されたロケール2 に設定します。 それ以外の場合は、次のステップに進みます。
  4. ロケール・カテゴリーをデフォルトの C *LOCALE オブジェクトに設定します。
LC_UNI_ALL

ユーザーのモジュールが LOCALETYPE(*LOCALEUCS2) オプションによってコンパイルされている場合は、以下のようにします。

  1. LC_UCS2_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、すべての Unicode ロケール・カテゴリーに、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  2. 各 Unicode ロケール・カテゴリーごとに、対応する環境変数1 (LC_UCS2_CTYPE、 LC_UCS2_COLLATE、 LC_UCS2_TIME、 LC_UCS2_NUMERIC、 LC_UCS2_MESSAGES、 LC_UCS2_MONETARY、または LC_UCS2_TOD)3 を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。
  3. ロケール・カテゴリーをデフォルトの UCS-2 *LOCALE オブジェクトに設定します。

ユーザーのモジュールが LOCALETYPE(*LOCALEUTF) オプションによってコンパイルされている場合は、以下のようにします。

  1. LC_UTF_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、すべての Unicode ロケール・カテゴリーに、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  2. 各 Unicode ロケール・カテゴリーごとに、対応する環境変数1 (LC_UTF_CTYPE、 LC_UTF_COLLATE、LC_UTF_TIME、LC_UTF_NUMERIC、 LC_UTF_MESSAGES、LC_UTF_MONETARY、または LC_UTF_TOD)3 を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。
  3. LANG 環境変数1 を確認します。 前のステップで設定されなかった各ロケール・カテゴリーごとに、 LANG 環境変数が定義済みで非ヌルの場合は、ロケール・カテゴリーを指定されたロケールに設定します。 それ以外の場合は、それをデフォルトの UTF *LOCALE オブジェクトに設定します。
LC_UNI_CTYPE
LC_UNI_COLLATE
LC_UNI_TIME
LC_UNI_NUMERIC
LC_UNI_MESSAGES
LC_UNI_MONETARY
LC_UNI_TOD

ユーザーのモジュールが LOCALETYPE(*LOCALEUCS2) オプションによってコンパイルされている場合は、以下のようにします。

  1. 指定されたロケール・カテゴリー1 (LC_UCS2_CTYPE、LC_UCS2_COLLATE、LC_UCS2_TIME、 LC_UCS2_NUMERIC、LC_UCS2_MESSAGES、 LC_UCS2_MONETARY、または LC_UCS2_TOD)3 に対応する環境変数を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  2. LC_UCS2_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  3. ロケール・カテゴリーをデフォルトの UCS-2 *LOCALE オブジェクトに設定します。

ユーザーのモジュールが LOCALETYPE(*LOCALEUTF) オプションによってコンパイルされている場合は、以下のようにします。

  1. 指定されたロケール・カテゴリー1 (LC_UTF_CTYPE、LC_UTF_COLLATE、LC_UTF_TIME、 LC_UTF_NUMERIC、LC_UTF_MESSAGES、LC_UTF_MONETARY、または LC_UTF_TOD)3 に対応する環境変数を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  2. LC_UTF_ALL 環境変数1 を確認します。 この環境変数が定義済みで非ヌルの場合は、指定されたロケールを使用します。 それ以外の場合は、次のステップに進みます。
  3. LANG 環境変数1 を確認します。 LANG 環境変数が定義済みで非ヌルの場合は、ロケール・カテゴリーを指定されたロケールに設定します。 それ以外の場合は、それをデフォルトの UTF *LOCALE オブジェクトに設定します。
注:
1 ロケール・カテゴリーに対応する名前を持つ環境変数は、 ユーザーによって作成されます。 LANG 環境変数は、以下のいずれかのロケール・パス名を指定する際、ジョブ開始時に自動的に作成されます。 ロケール環境変数には、 /QSYS.LIB/<locname>.LOCALE または /QSYS.LIB/<libname>.LIB/<locname>.LOCALE という形式のロケール・パス名が含まれると想定されます。 ユーザーのモジュールが LOCALETYPE(*LOCALEUTF) オプションによってコンパイルされている場合、 環境変数は、パスの <locname> 部分が 8 文字を超えると無視されます。 このような制約があるのは、対応する UTF ロケールの名前を取得する場合に、 ロケール名に 2 文字の接尾部を追加する必要があるためです。
注:
2 コンパイル・コマンドで LOCALETYPE(*LOCALEUTF) が指定された場合、 setlocale() 関数は、LC_ALL、LC_CTYPE、LC_COLLATE、LC_TIME、LC_NUMERIC、 LC_MESSAGES、LC_MONETARY、 LC_TOD、および LANG 環境変数に、後書きの _8 を追加します。 このロケールが見つからない場合は、UTF デフォルト・ロケール・オブジェクトが使用されます。 例えば、LANG が /QSYS.LIB/EN_US.LOCALE に設定されている場合に setlocale(LC_ALL、"") を指定すると、setlocale() によってロケール /QSYS.LIB/EN_US_8.LOCALE のロードが試行されます。 LANG 環境変数を使用していずれかの Unicode ロケール・カテゴリー (LC_UNI_ALL、LC_UNI_CTYPE、LC_UNI_COLLATE、LC_UNI_TIME、LC_UNI_NUMERIC、 LC_UNI_MESSAGES、 LC_UNI_MONETARY、または LC_UNI_TOD) を設定した場合、 setlocale() は、環境変数に保管されたロケール名の最後に _4 を追加します。 これは、対応する UTF-32 ロケールを見つける試みです。 このロケールが見つからない場合は、デフォルトの UTF-32 ロケール・オブジェクトが使用されます。 例えば、LANG が /QSYS.LIB/EN_US.LOCALE に設定されている場合に setlocale(LC_UNI_TIME、"") を指定すると、setlocale() によってロケール /QSYS.LIB/EN_US_4.LOCALE のロードが試行されます。 _4 および _8 で終わるロケール名は、 CCSID(*UTF) で作成されたロケールの場合には、 CRTLOCALE CL コマンド (i5/OS Information Center のトピック『CRTLOCALE (ロケール作成) コマンド』の情報を参照) によって導入された命名規則に従っています。
注:
3 LC_UNI_ALL、LC_UNI_COLLATE、LC_UNI_CTYPE、LC_UNI_TIME、LC_UNI_NUMERIC、 LC_UNI_MESSAGES、LC_UNI_MONETARY、および LC_UNI_TOD の各ロケール・カテゴリー名は、 UCS-2 と UTF の間で共用されます。 これらのカテゴリーに対応する環境変数は、共用できません。 したがって、環境変数の名前は、ロケール・カテゴリー名と完全には一致しません。 UCS-2 環境変数名の場合は、UNI が UCS2 で置換されます (例えば、 LC_UNI_ALL ロケール・カテゴリーは LC_UCS2_ALL 環境変数になります)。 UTF 環境変数の場合は、UNI が UTF で置換されます (例えば、 LC_UNI_ALL ロケール・カテゴリーは LC_UTF_ALL 環境変数になります)。

LOCALETYPE(*LOCALEUCS2) または LOCALETYPE(*LOCALEUTF) でコンパイルされた場合、 ロケールは、LC_UNI_ で始まるカテゴリーの有効な Unicode ロケールを指すポインターでなければならず、 その他のカテゴリーの Unicode ロケールであってはなりません。

戻り値

setlocale() 関数は、現行ロケールの設定を表すストリングを指すポインターを戻します。 戻されたストリングが保管された場合、 保管されたストリング値を setlocale() 関数への入力として使用し、 ロケール設定を随時復元することができます。 ただし、ストリングをユーザー定義のバッファーにコピーする必要があります。 そうしないと、以後 setlocale() を呼び出したときに、ストリングが上書きされます。

注:
setlocale() への正常な呼び出しによって指されたストリングが、 以後の setlocale() 関数への呼び出しによって上書きされることがあるため、 後でそのストリングを使用する予定がある場合は、これをコピーしてください。 ロケール・ストリングの正確な形式は、ロケール・タイプ *CLD、*LOCALE、*LOCALEUCS2、 および *LOCALEUTF の間で異なります。

ロケールを照会するには、NULL を 2 番目のパラメーターとして指定してください。 例えば、ユーザーのロケールのすべてのカテゴリーを照会するには、 次のステートメントを入力します。

    char *string = setlocale(LC_ALL, NULL);

エラー条件

エラーの場合、setlocale() 関数は NULL を戻します。 プログラムのロケールは変更されません。

*CLD ロケール・オブジェクトの使用例

 /************************************************************************
 
This example sets the locale of the program to
LC_C_FRANCE *CLD and prints the string
that is associated with the locale. This example must be compiled with
the LOCALETYPE(*CLD) parameter on the compilation command.        
  *
 
 ************************************************************************/
 
#include <stdio.h>
#include <locale.h>
 
char *string;
 
int main(void)
{
   string = setlocale(LC_ALL, LC_C_FRANCE);
   if (string != NULL)
      printf(" %s ¥n",string);
}

*LOCALE オブジェクトの使用例

/************************************************************************
 
This example sets the locale of the program to be "POSIX" and prints
the string that is associated with the locale.  This example must be
compiled with the LOCALETYPE(*LOCALE) parameter on the CRTCMOD or
CRTBNDC command.
 
 ************************************************************************/
 
#include <stdio.h>
#include <locale.h>
 
char *string;
 
int main(void)
{
 
   string = setlocale(LC_ALL, "POSIX");
   if (string != NULL)
      printf(" %s ¥n",string);
 
}

関連情報



[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]