本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > s

setlocale(3C)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

setlocale(), getlocale() ― プログラムの locale の設定、確認

構文

#include <locale.h>

char *setlocale(int category, const char *locale);

struct locale_data *getlocale(int type);

廃止インタフェース

int  setlocale_r(int category, const char *locale, char *buffer,
     int buflen);
 
int  getlocale_r(int type, struct locale_data *ld);

説明

setlocale() 関数は、category 引き数で指定されたプログラムの locale のアスペクトに対して設定、問合わせ、復旧を行います。プログラムの locale は、以下の category の値で定義されている、プログラムの母国語サポート (NLS) 環境の領域を参照します。

LC_ALL  

nl_langinfo(3C) の項目と、下記のすべてのカテゴリの動作に作用します。

LC_COLLATE  

正規表現および NLS 文字列照合関数 (string(3C) および regexp(5) を参照) の動作に作用します。

LC_CTYPE  

正規表現、文字の分類、変換関数 (ctype(3C) wctype(3C) wconv(3C) conv(3C) および regexp(5) を参照) の動作に作用します。 LC_CTYPE カテゴリは、マルチバイト文字 (multibyte(3C) を参照) を処理しているすべてのルーチンの動作に対しても作用します。

LC_MESSAGES  

メッセージが表示される言語および肯定、否定の応答のプロセスに作用します (catopen(3C) および nl_langinfo(3C) を参照)。

LC_MONETARY  

金銭に関する値 (localeconv(3C) および strfmon(3C) を参照) を扱う関数の動作に作用します。

LC_NUMERIC  

書式指定付き入出力関数 printf(3S), scanf(3S), vprintf(3S) を参照) での小数点キャラクタ、および文字列変換関数 ecvt(3C) および strtod(3C) を参照) の扱いに作用します。LC_NUMERIC も、 localeconv 構造体中の数値に対して作用します。

LC_TIME  

時間変換関数 getdate(3C), strftime(3C), および strptime(3C) を参照) の動作に作用します。

すべての nl_langinfo(3C) の項目は、上記のカテゴリのうちの 1 つを設定すると作用します。 各項目に対してどのカテゴリが作用するかについては、 langinfo(5) を参照してください。

locale 引き数の値は setlocale() の動作を決定します。 locale は文字列型へのポインターです。

setlocale() は複数のスレッドから同時に呼び出すことができます。アップデートされた locale データ構造体は、別のスレッドからの読み取りに対して保護されていません。 そのため、locale 変更時の適切な同期処理は、アプリケーション作成者に一任されています。

プログラムのロケールの設定

category に対してプログラムのロケールを設定するには、 setlocale()locale 引き数の値は、 locale nameCPOSIX、または "" (空の文字列) のいずれかになります。その値によって指示される動作は以下のとおりです。

locale name  

locale が locale 名 lang(5) を参照) として適当であれば、setlocale() は NLS 環境のその部分を、その locale に対して定義された category に結合します。

C  

locale の値が C に設定されている場合には、setlocale() は NLS 環境のその部分を、C locale (lang(5) を参照) に対して定義された category に結合します。 C locale は setlocale() の正常な呼び出しに優先するデフォルトです。

POSIX  

C と同じ

""  

locale の値が空の文字列である場合には、NLS 環境のその部分と category との結合は、 以下に示すユーザー環境 environ(5) を参照) 中の環境変数の設定に従います。

LANG                LC_MESSAGES 
LC_ALL              LC_MONETARY 
LC_COLLATE          LC_NUMERIC 
LC_CTYPE            LC_TIME 

categoryLC_ALL 以外の値に定義された場合、setlocale() はそのカテゴリを LC_ALL 環境の値で指定されたとおりに設定します。これは、LC_ALL が対応する環境変数に設定されていない場合も同様です。 環境変数が設定されていなかったり、空の文字列である場合には、setlocale() はカテゴリを LANG 環境変数の値で指定されたとおりに設定します。LANG が設定されていなかったり、空の文字列である場合には、setlocale() はカテゴリを C locale に設定します。たとえば、

setlocale(LC_TIME,"") 

は、プログラムの LC_TIME category に結合している NLS 環境 をユーザーの LC_TIME 環境変数で指定された値に設定します。他の NLS 環境のアスペクトは まったく作用しません。

categoryLC_ALL である場合には、対応する環境変数が適切な言語名 (lang(5) を参照) に設定されていないすべてのカテゴリは、LC_ALL が設定されていれば LC_ALL の値に設定され、LC_ALL が設定されていなければ LANG の値に設定されます。この場合、環境変数の値は、そのカテゴリに対する LC_ALL および LANG の値を置き換えます。LC_ALLLANG の双方の値が設定されていない場合、双方が空の文字列である場合には、C locale が用いられます。

setlocale() を以下のように用いると、プログラムの locale はユーザーの言語の要求に従って設定されます。

setlocale(LC_ALL,"") 

プログラムのロケールの問合わせ

setlocale()locale が NULL である場合には、 category に属している現在の NLS 環境を問い合わせます。 問合わせによって、環境が変わることはありません。問合わせを行う目的は、 category に結合しているユーザーの現在の NLS を、 setlocale() から返される値に保存し、続いて呼び出される setlocale() によってそれを復旧できるようにするためです。

プログラムのロケールの復旧

プログラム locale の中のカテゴリを復旧するには、setlocale() の呼び出しを同じ category 引き数とし、その前の setlocale() 呼び出しによって返された文字列を locale 引き数として行います。

getlocale()locale_data 構造体 (/usr/include/locale.h を参照) へのポインターを返します。 locale_data 構造体のメンバーは、各 setlocale() カテゴリの設定に関する情報を持っています。 typelocale_data 構造体に含まれる情報が何かを表します。 type に指定可能な値は、以下のとおりです。

LOCALE_STATUS  

各カテゴリに対応する構造体メンバーの内容は、そのカテゴリに現在設定されている locale 名を表す文字列になります。文字列には修飾子の情報は含まれません。

廃止インタフェース

setlocale_r()getlocale_r() は、プログラムの locale の設定と取得を行います。

戻り値

locale として文字列へのポインターが与えられ、その選択が認められる場合には、setlocale() 関数は指定された category に結合している文字列へのポインターを新しい locale として返します。この文字列の最大の長さは、LC_BUFSIZ (<locale.h> を参照) です。選択が認められない場合には、setlocale() 関数は、null ポインターを返し、プログラムの locale は変更されません。

locale に対する null ポインターにより、setlocale() はプログラムの現在の locale の category に結合している文字列を返します。

setlocale() によって返される文字列は、 setlocale() を再度呼び出すときに、 locale 引き数として用いられ、それに結合している category が、プログラムの locale のその部分を復旧します。

エラー

locale 引き数の指定する言語名が適切な言語を指さなかったり、言語名が 256 文字を超えていたり、あるいは言語がそのシステムでは利用できない場合 (lang(5) を参照) には、null ポインターが返され、プログラムの locale は変更されません。同じことは、以下のような呼び出しを行い、ユーザーの環境の中の環境変数に結合しているカテゴリが、不適切な言語名であるかシステムで利用できない言語を指している時にも起こります。

setlocale(LC_ALL, ""); 

category 引き数が定義されているカテゴリの値でない場合には、null ポインターが返され、プログラムの locale は変更されません。

setlocale()category 引き数に結合している NLS 環境のアスペクトの現在の 設定を反映している文字列を返します。返された文字列は、それ以降の setlocale() の呼び出しで用いられ、2 つの呼び出しにおいて category 引き数が一致しない場合には、locale は変更されず、null ポインターが返されます。

以下の例は、ユーザーの環境変数で指定された言語の要求をもとにプログラムのすべての locale を設定します。

setlocale(LC_ALL, ""); 

ユーザーの環境変数が以下のように設定されている場合を例にします。

LANG ="de_DE.iso88591" 
LC_COLLATE ="es_ES.iso88591" 
LC_MONETARY ="" 
LC_TIME ="en_US.iso88591" 

LC_CTYPE, LC_MONETARY, および LC_NUMERIC カテゴリ項目は、de_DE.iso88591 の言語定義に結合するように設定され、LC_COLLATE カテゴリ項目は、es_ES.iso88591 の言語定義に結合するよう設定され、LC_TIME カテゴリ項目は en_US.iso88591 の言語定義に結合するよう設定されます。

同じ例を用いて、以下のような呼び出しが行われるとします。

struct locale_data *locale_info=getlocale(LOCALE_STATUS); 

この時、*locale_info の内容は以下のようになります。

locale_info->LC_ALL_D="de_DE.iso88591" 
locale_info->LC_COLLATE_D="es_ES.iso88591" 
locale_info->LC_CTYPE_D="de_DE.iso88591" 
locale_info->LC_MESSAGES_D="de_DE.iso88591" 
locale_info->LC_MONETARY_D="de_DE.iso88591" 
locale_info->LC_NUMERIC_D="de_DE.iso88591" 
locale_info->LC_TIME_D="en_US.iso88591" 

次の例では、LC_ALL 環境変数の優先を示します。

setlocale(LC_ALL, ""); 

ユーザー環境が以下のように設定されているとします。

LANG=de_DE.iso88591 
LC_ALL=fr_FR.iso88591 

この時、すべてのカテゴリが fr_FR.iso88591 に設定されます。

LC_ALL 環境変数の優先例をもう 1 つ示します。

setlocale(LC_CTYPE, ""); 

ユーザー環境が以下のように設定されているとします。

LANG=tr_TR.iso88599 
LC_ALL=da_DK.iso88591 
LC_CTYPE=ru_RU.iso88595 

この時、すべてのカテゴリが da_DK.iso88591 でロードされます。

LC_ALL 環境変数の例をもう 1 つ示します。

setlocale(LC_TIME, "pl_PL.iso88592"); 

ユーザー環境が以下のように設定されているとします。

LANG=it_IT.iso88591 
LC_ALL=nl_NL.iso88591 

LC_TIME カテゴリは、pl_PL.iso88592 に設定されます。しかし、他のすべてのカテゴリは nl_NL.iso88591 に設定されます。

以下の例は、日付/時刻の書式を fr_FR.iso88591 に設定します。

setlocale(LC_TIME, "fr_FR.iso88591"); 

以下の例は、照合順序を C locale に設定します。

setlocale(LC_COLLATE, "C"); 

以下の例は、一時ハンドリングを、ユーザーの LC_MONETARY 環境変数の値に設定します。

setlocale(LC_MONETARY, ""); 

LC_MONETARY 環境変数が設定されていなかったり、空の文字列である場合には、ユーザーの LANG 環境変数が用いられることに注意してください。

以下の例は、ユーザーの locale を問い合わせます。

char *ch = setlocale(LC_ALL, NULL);

上記の例で保存された locale を復旧するには、次のようにします。

setlocale(LC_ALL, ch); 

以下の例は、 LC_NUMERIC カテゴリに属しているユーザー locale の部分のみを問い合わせます。

char *ch = setlocale(LC_NUMERIC, NULL); 

上記の例で保存されたユーザーの locale の LC_NUMERIC カテゴリのみを復旧するには次のようにします。

setlocale(LC_NUMERIC, ch); 

警告

setlocale() のリターン文字列のフォーマットは処理系に固有のもので、各ベンダーのプラットフォームで標準化されたものではありません。また、将来リリースされる製品で変更される可能性があります。リターン文字列は、setlocale() を実行するプロセスが実行されている間のみ有効で、すでに保存されているロケールの設定を同じプロセスで再び使用する場合のみに使用します。

getenv()locale は、引き数として使用しない方がよいでしょう。以下にその誤った使用法を示します。

setlocale(LC_ALL, getenv("LANG")); 

getenv() は、言語名, 空の文字列, null ポインターの文字列を、ユーザーの LANG 環境変数の設定に応じて返します。locale 引き数としてのそれらの値は、setlocale() によって行われる特定の動作を定義しています。したがって、setlocale() によって行われる動作は、getenv() の呼び出しから返される値に依存します。setlocale() がプログラムの locale をユーザーの環境変数の設定に従って設定しないようにするには、以下の使い方がよいでしょう。

setlocale(LC_ALL, ""); 

setlocale() によって返される値は、次の setlocale() の呼び出しの間にオーバーライトされる領域を指しています。それらの値を次の setlocale() の呼び出し以降で使用する場合には、それらを他の領域にコピー するようにしてください。

setlocale() の呼び出しは、HP-UX 10.0 でサポートが中止された、HP-UX 9.x での古い HP 独自のロケール名の使用をサポートしていません。新しい ISO のロケール名 (リリースノートに記載) を使用してください。

getlocale() は、HP 独自のインタフェースで、将来リリースされる製品では廃止 される予定です。 また、この関数は、他のベンダーのプラトフォームへ移植することはできません。

getlocale() の呼び出しによって返される構造体は、次の getlocale() 呼び出しの間にオーバーライトされます。それらの値を次以降の getlocale() 呼び出しで用いる場合には、それらを保存するようにしてください。

locale の状態はプロセス内のすべてのスレッドで共通であることに注意してください。

getlocale_r() および setlocale_r() インタフェースは廃止され、現在では既存の DCE アプリケーションとの互換性を保つためにだけサポートされています。新しいマルチスレッドアプリケーションでは、 getlocale() および setlocale() を使用してください。

現リリースでは、LC_MESSAGESXPG4 に追加されているため、oflag パラメータが NL_CAT_LOCALE に設定された状態で、catopen() より前で setlocale() を呼び出すプログラムはすべて、以前のリリースとは異なった動作をすることがあります。以前は catopen()LANG によって、希望の言語を指定するようになっていました。現在は、oflag パラメータが NL_CAT_LOCALE に設定された catopen() の制御は LC_MESSAGES で行います。 setlocale()LC_MESSAGES カテゴリを変更することができます。 たとえば、環境変数が以下のように設定されているとします。

LC_MESSAGES="fr_FR.iso88591" 

ここで、catopen() を呼び出した後で 以下のように setlocale() を呼び出します。

setlocale(LC_ALL, "de_DE.iso88591"); 

catopen() により、fr_FR.iso88591 ではなく de_DE.iso88591 に対するメッセージカタログがオープンされます。

setlocale() を使用してアプリケーションのアーカイブをコンパイルまたはリンクする場合は、setlocale()libdld.sl と依存関係があり、 コンパイルまたはリンク用のコマンドを変更しなければならない ことに注意してください。

コンパイルする場合は、以下のように指定します。

cc -Wl,-a,archive -Wl,-E -Wl,+n -l:libdld.sl -o <outfile> <source> 

または、

CCOPTS および LDOPTS を使用し、以下のように指定してコンパイルします。

  • export CCOPTS="-Wl,-a,archive <options> -Wl,-E -l:libdld.sl"

  • export LDOPTS="<options> -E +n -l:libdld.sl"

    cc -o <outfile> <source> 

オプションの -Wl,-a,archive は部分的に依存関係があり、コンパイルを指定するコマンド行の最初で指定します。将来リリースされる製品との優れた互換性を保つためには、アーカイブされた libc を他の共有ライブラリとともに使用しないでください。ただし、上記の場合に必要な libdld.sl は例外とします。

著者

setlocale()setlocale_r()getlocale()、および getlocale_r() は OSF および HP で開発されました。

ファイル

/usr/include/langinfo.h
/usr/include/locale.h

標準準拠

setlocale(): AES, SVID3, XPG3, XPG4, FIPS 151-2, POSIX.1, ANSI C

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.