setlocale、_wsetlocale
ロケールを定義します。
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 );
}
同等の .NET Framework 関数
System::Globalization::CultureInfo クラス
参照
参照
strlen、strlen_l、wcslen、wcslen_l、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_l
strftime、wcsftime、_strftime_l、_wcsftime_l