setlocale、_wsetlocale
更新 : 2007 年 11 月
ロケールを定義します。
char *setlocale(
int category,
const char *locale
);
wchar_t *_wsetlocale(
int category,
const wchar_t *locale
);
パラメータ
category
ロケールの影響を受けるカテゴリ。locale
ロケール名。
戻り値
有効なロケールとカテゴリを指定すると、指定されたロケールおよびカテゴリに関連付けられている文字列へのポインタを返します。ロケールまたはカテゴリが無効な場合は NULL ポインタを返し、プログラムの現在のロケール設定は変更しません。
呼び出しの例を次に示します。
setlocale( LC_ALL, "English" );
この呼び出しではすべてのカテゴリを設定し、次の文字列だけを返します。
English_United States.1252
すべてのカテゴリを明示的に設定せずに setlocale 関数を呼び出すと、それぞれのカテゴリの現在の設定を示す文字列がセミコロンで区切って返されます。locale 引数が null ポインタの場合、setlocale 関数は、プログラムのロケールの category に関連付けられている文字列へのポインタを返します。プログラムの現在のロケール設定は変更しません。
NULL ポインタは、setlocale 関数に、各国対応環境を設定するのではなく問い合わせるように指示する特殊なディレクティブです。たとえば、次の呼び出しシーケンスを実行します。
// Set all categories and return " English_United States.1252"
setlocale( LC_ALL, "English" );
// Set only the LC_MONETARY category and return "French_France.1252"
setlocale( LC_MONETARY, "French" );
setlocale( LC_ALL, NULL );
返される結果は以下のようになります。
LC_COLLATE= English_United States.1252;
LC_CTYPE= English_United States.1252;
LC_MONETARY=French_France.1252;
LC_NUMERIC= English_United States.1252;
LC_TIME= English_United States.1252
これは、LC_ALL カテゴリに関連付けられている文字列です。
setlocale 関数が返した文字列ポインタや文字列の内容をプログラムで変更しない限り、この文字列ポインタを使って、プログラムのロケール情報の一部を後で復元できます。setlocale 関数を続けて呼び出すと、文字列が上書きされます。特定のロケール文字列を保存するには、_strdup を使用します。
解説
setlocale 関数は、locale と category で指定された現在のロケール情報 (一部またはすべて) を設定、変更、または問い合わせるときに使用します。locale とは国や言語に特有の情報を意味しており、この地域性に合わせてプログラムのさまざまな側面をカスタマイズできます。ロケールに依存するカテゴリとしては、日付の形式や通貨値の表示形式などがあります。1 つの言語で複数の形式がサポートされている場合、その言語の既定文字列を locale に設定したときに、setlocale 関数が戻す値をチェックし、どの形式が有効になっているのか確認する必要があります。たとえば、"chinese" を指定すると、chinese-simplified または chinese-traditional のいずれかの値が返されます。
_wsetlocale は setlocale のワイド文字バージョンで、locale 引数と _wsetlocale の戻り値はワイド文字列です。引数の指定以外では、_wsetlocale 関数と setlocale 関数の動作は同じです。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tsetlocale |
setlocale |
setlocale |
_wsetlocale |
引数 category は、プログラムのロケール情報のどの部分を変更するのかを指定します。category 用のマクロと、マクロの対象となるプログラム部分は次のとおりです。
LC_ALL
以下に示すすべてのカテゴリ。LC_COLLATE
strcoll、_stricoll、wcscoll、_wcsicoll、strxfrm、_strncoll、_strnicoll、_wcsncoll、_wcsnicoll、および wcsxfrm の各関数。LC_CTYPE
文字処理関数 (isdigit、isxdigit、mbstowcs、および mbtowc の各関数は除く)。LC_MONETARY
localeconv 関数から返される通貨形式の情報。LC_NUMERIC
書式付き出力ルーチン (printf など) とデータ変換ルーチンの小数点文字、および localeconv が返す非通貨形式の情報の小数点文字。LC_NUMERIC は、小数点文字の他に、千単位の桁区切り記号と localeconv 関数が返すグループ化制御文字列も設定します。LC_TIME
strftime 関数と wcsftime 関数。
この関数は、カテゴリ パラメータを検証します。カテゴリ パラメータが上記の表のいずれの値でもない場合、「パラメータの検証」に説明されているように、無効なパラメータ ハンドラを呼び出します。実行の継続が許可された場合、この関数は errno を EINVAL に設定し、NULL を返します。
locale 引数は、ロケール名を指定する文字列へのポインタです。locale が空の文字列を指す場合、ロケールは実装で定義されているネイティブ環境になります。値 C は、C に関する ANSI 規格に最低限準拠した環境を指定します。C ロケールでは、すべての char データ型が 1 バイトで、値は常に 256 未満であることを前提にしています。
プログラムの起動時に、次のステートメントと同等の処理が実行されます。
setlocale( LC_ALL, "C" );
locale 引数の書式は、次のとおりです。
locale :: "lang[_country_region[.code_page]]"
| ".code_page"
| ""
| NULL
使用できる言語、国/地域コード、およびコード ページには、Win32 NLS API でサポートされるものがすべて含まれます (ただし、UTF-7 や UTF-8 のように、1 文字に 3 バイト以上必要なコード ページは除きます)。UTF-7 や UTF-8 などのコード ページを指定した場合、setlocale は実行に失敗し、NULL が返されます。setlocale 関数でサポートされる言語や地域コードについては、「言語および国/地域識別文字列」を参照してください。
locale が null ポインタの場合、setlocale 関数は、各国対応の環境を設定せずに問い合わせを行い、指定した category に関連付けられている文字列へのポインタを返します。プログラムの現在のロケール設定は変更されません。次に例を示します。
setlocale( LC_ALL, NULL );
この場合、category に関連付けられた文字列が返されます。
次の例も、LC_ALL カテゴリの例です。文字列 ".OCP" と ".ACP" はそれぞれ、システムの既定の OEM コード ページおよび ANSI コード ページを指定するコード ページ番号の代わりに使用できます。
setlocale( LC_ALL, "" );
ロケールを既定値に設定します。これはシステムの既定の ANSI コード ページで、オペレーティング システムから取得します。setlocale( LC_ALL, ".OCP" );
ロケールをオペレーティング システムから取得した現在の OEM コード ページに明示的に設定します。setlocale( LC_ALL, ".ACP" );
ロケールをオペレーティング システムから取得した ANSI コード ページに設定します。setlocale( LC_ALL, "[lang_ctry]" );
ホスト オペレーティング システムから取得した既定のコード ページを使用して、ロケールを指定されている言語と地域に設定します。setlocale( LC_ALL, "[lang_ctry.cp]" );
ロケールを [lang_ctry.cp] 文字列で指定された言語、地域、およびコード ページに設定します。言語、地域、コード ページは、さまざまな組み合わせで指定できます。次に例を示します。setlocale( LC_ALL, "French_Canada.1252" ); // Set code page to French Canada ANSI default setlocale( LC_ALL, "French_Canada.ACP" ); // Set code page to French Canada OEM default setlocale( LC_ALL, "French_Canada.OCP" );
setlocale( LC_ALL, "[lang]" );
指定されている言語の既定の地域と、その地域に関してホスト オペレーティング システムから取得したシステムの既定の ANSI コード ページに、ロケールを設定します。たとえば、次に示す setlocale 関数の 2 つの呼び出しは機能的に同等です。setlocale( LC_ALL, "English" ); setlocale( LC_ALL, "English_United States.1252" );
setlocale( LC_ALL, "[.code_page]" );
コード ページを指定された値に設定し、そのコード ページに対する既定の (ホスト オペレーティング システムで定義される) 既定の言語と地域を設定します。
コード ページを変更するには、カテゴリを LC_ALL または LC_CTYPE のいずれかにします。たとえば、ホスト オペレーティング システムの既定の地域と言語がそれぞれ "United States" と "English" の場合、次の setlocale 関数の 2 つの呼び出しは機能的に同等です。
setlocale( LC_ALL, ".1252" );
setlocale( LC_ALL, "English_United States.1252");
詳細については、「C/C++ Preprocessor Reference」の「setlocale」を参照してください。
_configthreadlocale 関数は、setlocale をプログラムのすべてのスレッドのロケールに適用する、または呼び出し元のロケールに限定するかを制御するために使用します。
必要条件
ルーチン |
必須ヘッダー |
---|---|
setlocale |
<locale.h> |
_wsetlocale |
<locale.h> または <wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_setlocale.cpp
//
// This program demonstrates the use of setlocale when
// using two independent threads.
//
#include <locale.h>
#include <process.h>
#include <windows.h>
#include <stdio.h>
#include <time.h>
#define BUFF_SIZE 100
// Retrieve the date and time in the current
// locale's format.
int get_time(unsigned char* str)
{
__time64_t ltime;
struct tm thetime;
// Retieve the time
_time64(<ime);
_gmtime64_s(&thetime, <ime);
// Format the current time structure into a string
// using %#x is the long date representation,
// appropriate to the current locale
if (!strftime((char *)str, BUFF_SIZE, "%#x",
(const struct tm *)&thetime))
{
printf("strftime failed!\n");
return -1;
}
return 0;
}
// This thread sets its locale to German
// and prints the time.
unsigned __stdcall SecondThreadFunc( void* pArguments )
{
unsigned char str[BUFF_SIZE];
// Set the thread local
printf("The thread locale is now set to %s.\n",
setlocale(LC_ALL, "German"));
// Retrieve the time string from the helper function
if (get_time(str) == 0)
{
printf("The time in German locale is: '%s'\n", str);
}
_endthreadex( 0 );
return 0;
}
// The main thread spawns a second thread (above) and then
// sets the locale to English and prints the time.
int main()
{
HANDLE hThread;
unsigned threadID;
unsigned char str[BUFF_SIZE];
// Configure per-thread locale to cause all subsequently created
// threads to have their own locale.
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);
// Retrieve the time string from the helper function
printf("The thread locale is now set to %s.\n",
setlocale(LC_ALL, "English"));
// Create the second thread.
hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,
NULL, 0, &threadID );
if (get_time(str) == 0)
{
// Retrieve the time string from the helper function
printf("The time in English locale is: '%s'\n\n", str);
}
// Wait for the created thread to finish.
WaitForSingleObject( hThread, INFINITE );
// Destroy the thread object.
CloseHandle( hThread );
}
The thread locale is now set to English_United States.1252.
The time in English locale is: 'Wednesday, May 12, 2004'
The thread locale is now set to German_Germany.1252.
The time in German locale is: 'Mittwoch, 12. Mai 2004'
.NET Framework の相当するアイテム
System::Globalization::CultureInfo クラス
参照
参照
strlen、strlen_l、wcslen、wcslen_l、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_l
strftime、wcsftime、_strftime_l、_wcsftime_l