setlocale、_wsetlocalesetlocale, _wsetlocale

実行時ロケールを設定または取得します。Sets or retrieves the run-time locale.

構文Syntax

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

パラメーターParameters

categorycategory
ロケールに影響されるカテゴリ。Category affected by locale.

localelocale
ロケールの指定子。Locale specifier.

戻り値Return Value

有効なロケールカテゴリが指定されている場合、は、指定されたロケールおよびカテゴリに関連付けられている文字列へのポインターを返します。If a valid locale and category are given, returns a pointer to the string associated with the specified locale and category. ロケールまたはカテゴリが有効でない場合、は null ポインターを返し、プログラムの現在のロケール設定は変更されません。If the locale or category is not valid, returns a null pointer and the current locale settings of the program are not changed.

たとえば、For example, the call

setlocale( LC_ALL, "en-US" );

を呼び出すと、すべてのカテゴリを設定し、文字列だけを返しますsets all categories, returning only the string

en-US

Setlocaleによって返された文字列をコピーして、プログラムのロケール情報のその部分を復元できます。You can copy the string returned by setlocale to restore that part of the program's locale information. Setlocaleによって返される文字列には、グローバルまたはスレッドローカルストレージが使用されます。Global or thread local storage is used for the string returned by setlocale. 後でsetlocaleを呼び出すと、文字列が上書きされ、以前の呼び出しによって返された文字列ポインターが無効になります。Later calls to setlocale overwrite the string, which invalidates string pointers returned by earlier calls.

RemarksRemarks

Localeおよびcategoryによって指定された現在のプログラムのロケール情報の一部またはすべてを設定、変更、または照会するには、 setlocale関数を使用します。Use the setlocale function to set, change, or query some or all of the current program locale information specified by locale and category. ロケールとは、プログラムの特定の側面をカスタマイズできる地域 (国/地域と言語) を指します。locale refers to the locality (country/region and language) for which you can customize certain aspects of your program. ロケールに依存するカテゴリとしては、日付の形式や通貨値の表示形式などがあります。Some locale-dependent categories include the formatting of dates and the display format for monetary values. コンピューターで複数の形式がサポートされている言語の既定の文字列にロケールを設定した場合は、 setlocale戻り値をチェックして、有効な言語を確認する必要があります。If you set locale to the default string for a language that has multiple forms supported on your computer, you should check the setlocale return value to see which language is in effect. たとえば、 localeを "中国語" に設定した場合、戻り値は "簡体字中国語または繁体字中国語" のいずれかになります。For example, if you set locale to "chinese" the return value could be either "chinese-simplified" or "chinese-traditional".

_wsetlocaleは、 setlocaleのワイド文字バージョンです。 _wsetlocalelocale引数と戻り値はワイド文字列です。_wsetlocale is a wide-character version of setlocale; the locale argument and return value of _wsetlocale are wide-character strings. それ以外では、 _wsetlocalesetlocaleは同じように動作します。_wsetlocale and setlocale behave identically otherwise.

汎用テキスト ルーチンのマップGeneric-Text Routine Mappings

TCHAR.H のルーチンTCHAR.H routine _UNICODE および _MBCS が未定義の場合_UNICODE & _MBCS not defined _MBCS が定義されている場合_MBCS defined _UNICODE が定義されている場合_UNICODE defined
_tsetlocale_tsetlocale setlocalesetlocale setlocalesetlocale _wsetlocale_wsetlocale

Category引数は、影響を受けるプログラムのロケール情報の部分を指定します。The category argument specifies the parts of a program's locale information that are affected. Categoryに使用されるマクロと、影響を与えるプログラムの部分は次のとおりです。The macros used for category and the parts of the program they affect are as follows:

カテゴリフラグcategory flag 影響が及ぶ対象Affects
LC_ALLLC_ALL 次に示すように、すべてのカテゴリです。All categories, as listed below.
LC_COLLATELC_COLLATE Strcoll 系_stricollwcscoll_wcsicollstrxfrm、_strncoll 、_strnicoll_wcsncoll_wcsnicollwcsxfrmの各関数。The strcoll, _stricoll, wcscoll, _wcsicoll, strxfrm, _strncoll, _strnicoll, _wcsncoll, _wcsnicoll, and wcsxfrm functions.
LC_CTYPELC_CTYPE 文字処理関数 (影響を受けないisdigitisxdigitmbstowcs、およびmbtowcを除く)。The character-handling functions (except isdigit, isxdigit, mbstowcs, and mbtowc, which are unaffected).
LC_MONETARYLC_MONETARY Localeconv関数によって返される通貨書式情報。Monetary-formatting information returned by the localeconv function.
LC_NUMERICLC_NUMERIC 書式設定された出力ルーチン ( printfなど) の場合は小数点文字、データ変換ルーチンの場合は、 localeconvによって返される通貨以外の書式設定情報の場合は。Decimal-point character for the formatted output routines (such as printf), for the data-conversion routines, and for the non-monetary formatting information returned by localeconv. 小数点文字に加えて、 LC_NUMERICは、桁区切り記号と、 localeconvによって返されるグループ化コントロール文字列を設定します。In addition to the decimal-point character, LC_NUMERIC sets the thousands separator and the grouping control string returned by localeconv.
LC_TIMELC_TIME Strftime関数とwcsftime関数。The strftime and wcsftime functions.

この関数は、カテゴリ パラメーターを検証します。This function validates the category parameter. カテゴリ パラメーターが前の表に示されている値のいずれでもない場合は、「パラメータの検証」に説明されているように、無効なパラメーター ハンドラーが呼び出されます。If the category parameter is not one of the values given in the previous table, the invalid parameter handler is invoked, as described in Parameter Validation. 実行の継続が許可された場合、関数はerrnoEINVALに設定し、 NULLを返します。If execution is allowed to continue, the function sets errno to EINVAL and returns NULL.

Locale引数は、ロケールを指定する文字列へのポインターです。The locale argument is a pointer to a string that specifies the locale. Locale引数の形式の詳細については、「ロケール名、言語、および国/地域識別文字列」を参照してください。For information about the format of the locale argument, see Locale Names, Languages, and Country/Region Strings. ロケールが空の文字列をポイントしている場合は、実装定義のネイティブ環境になります。If locale points to an empty string, the locale is the implementation-defined native environment. C の値は、C 翻訳のための ANSI に準拠した最小環境を指定します。A value of C specifies the minimal ANSI conforming environment for C translation. Cロケールでは、すべてのcharデータ型が1バイトであり、その値が常に256未満であることを前提としています。The C locale assumes that all char data types are 1 byte and that their value is always less than 256.

プログラムの開始時に、次のステートメントの等価性の確認が実行されます。At program startup, the equivalent of the following statement is executed:

setlocale( LC_ALL, "C" );

Locale引数は、ロケール名、言語文字列、言語文字列と国/地域コード、コードページ、言語文字列、国/地域コード、およびコードページを受け取ることができます。The locale argument can take a locale name, a language string, a language string and country/region code, a code page, or a language string, country/region code, and code page. 使用できるロケール名、言語、国/地域コード、およびコード ページのセットには、1 文字に 2 バイトを超えるデータを必要とする (UTF-7、UTF-8 など) コード ページを除き、Windows の NLS API でサポートされるすべてが含まれています。The set of available locale names, languages, country/region codes, and code pages includes all those supported by the Windows NLS API except code pages that require more than two bytes per character, such as UTF-7 and UTF-8. UTF-8 または UTF-8 のコードページ値を指定すると、 setlocaleは失敗し、 NULLが返されます。If you provide a code page value of UTF-7 or UTF-8, setlocale will fail, returning NULL. Setlocaleでサポートされているロケール名のセットについては、「ロケール名、言語、および国/地域識別文字列」を参照してください。The set of locale names supported by setlocale are described in Locale Names, Languages, and Country/Region Strings. Setlocaleでサポートされる言語および国/地域識別文字列のセットは、「言語文字列国/地域識別文字列」に記載されています。The set of language and country/region strings supported by setlocale are listed in Language Strings and Country/Region Strings. パフォーマンス上の理由と、コードに埋め込まれた、またはストレージに対してシリアル化されたロケール文字列の保守容易性の理由により、ロケール名形式を使用することをお勧めします。We recommend the locale name form for performance and for maintainability of locale strings embedded in code or serialized to storage. オペレーティング システムの更新によってロケール名の文字列が変更される可能性は、言語および国/地域名の形式よりも低くなっています。The locale name strings are less likely to be changed by an operating system update than the language and country/region name form.

Locale引数として渡された null ポインターは、国際化環境を設定するのではなく、をクエリするようにsetlocaleに指示します。A null pointer that's passed as the locale argument tells setlocale to query instead of to set the international environment. Locale引数が null ポインターの場合、プログラムの現在のロケール設定は変更されません。If the locale argument is a null pointer, the program's current locale setting is not changed. 代わりに、 setlocaleは、スレッドの現在のロケールのカテゴリに関連付けられている文字列へのポインターを返します。Instead, setlocale returns a pointer to the string that's associated with the category of the thread's current locale. Category引数がLC_ALLの場合、関数は各カテゴリの現在の設定をセミコロンで区切って示す文字列を返します。If the category argument is LC_ALL, the function returns a string that indicates the current setting of each category, separated by semicolons. たとえば、呼び出しのシーケンスFor example, the sequence of calls

// Set all categories and return "en-US"
setlocale(LC_ALL, "en-US");
// Set only the LC_MONETARY category and return "fr-FR"
setlocale(LC_MONETARY, "fr-FR");
printf("%s\n", setlocale(LC_ALL, NULL));

の場合、returns

LC_COLLATE=en-US;LC_CTYPE=en-US;LC_MONETARY=fr-FR;LC_NUMERIC=en-US;LC_TIME=en-US

これは、 LC_ALLカテゴリに関連付けられている文字列です。which is the string that's associated with the LC_ALL category.

次の例は、 LC_ALLカテゴリに関連しています。The following examples pertain to the LC_ALL category. 文字列 ".OCP" および ".ACP" のどちらかをコード ページ番号の代わりに使用して、それぞれの文字列で、ユーザー既定の OEM コード ページおよびユーザー既定の ANSI コード ページを使用することを指定できます。Either of the strings ".OCP" and ".ACP" can be used instead of a code page number to specify use of the user-default OEM code page and user-default ANSI code page, respectively.

  • setlocale( LC_ALL, "" );

    ロケールを既定に設定します。これはオペレーティング システムから取得したユーザー既定の ANSI コード ページです。Sets the locale to the default, which is the user-default ANSI code page obtained from the operating system.

  • setlocale( LC_ALL, ".OCP" );

    ロケールに、オペレーティング システムから取得した現在の OEM コード ページを明示的に設定します。Explicitly sets the locale to the current OEM code page obtained from the operating system.

  • setlocale( LC_ALL, ".ACP" );

    ロケールに、オペレーティング システムから取得した ANSI コード ページを設定します。Sets the locale to the ANSI code page obtained from the operating system.

  • setlocale( LC_ALL, "<localename>" );

    ロケールに、 <localename> で表されるロケール名を設定します。Sets the locale to the locale name that's indicated by <localename>.

  • setlocale( LC_ALL, "<language>_<country>" );

    ロケールに、 <language><country> で表される言語と国/地域、およびホスト オペレーティング システムから取得した既定のコード ページを設定します。Sets the locale to the language and country/region indicated by <language> and <country>, together with the default code page obtained from the host operating system.

  • setlocale( LC_ALL, "<language>_<country>.<code_page>" );

    ロケールを、言語、国/地域、および <言語 ><country > 、および <code_page > 文字列で示されるコードページに設定します。Sets the locale to the language, country/region, and code page indicated by the <language>, <country>, and <code_page> strings. 言語、国/地域、およびコード ページはさまざまに組み合わせて使用できます。You can use various combinations of language, country/region, and code page. たとえば、次の呼び出しは、ロケールに、カナダ フランス語、およびコード ページ 1252 を設定します。For example, this call sets the locale to French Canada with code page 1252:

    setlocale( LC_ALL, "French_Canada.1252" );

    次の呼び出しは、ロケールに、カナダ フランス語、および既定の ANSI コード ページを設定します。This call sets the locale to French Canada with the default ANSI code page:

    setlocale( LC_ALL, "French_Canada.ACP" );

    次の呼び出しは、ロケールに、カナダ フランス語、および既定の OEM コード ページを設定します。This call sets the locale to French Canada with the default OEM code page:

    setlocale( LC_ALL, "French_Canada.OCP" );

  • setlocale( LC_ALL, "<language>" );

    ロケールに <language> で表される言語を設定し、指定した言語の既定の国/地域と、その国/地域のユーザー既定の ANSI コード ページをホスト オペレーティング システムから取得して使用します。Sets the locale to the language that's indicated by <language>, and uses the default country/region for the specified language and the user-default ANSI code page for that country/region as obtained from the host operating system. たとえば、次のsetlocaleへの呼び出しは機能的には同等です。For example, the following calls to setlocale are functionally equivalent:

    setlocale( LC_ALL, "en-US" );

    setlocale( LC_ALL, "English" );

    setlocale( LC_ALL, "English_United States.1252" );

    パフォーマンスと保守性の理由から、最初の形式を使用することをお勧めします。We recommend the first form for performance and maintainability.

  • setlocale( LC_ALL, ".<code_page>" );

    コード ページに、 <code_page> で表される値、および指定したコード ページの既定の国/地域と言語 (ホスト オペレーティング システムによって定義) を設定します。Sets the code page to the value indicated by <code_page>, together with the default country/region and language (as defined by the host operating system) for the specified code page.

カテゴリは、コードページの変更に影響を与えるために、 LC_ALLまたはLC_CTYPEのいずれかである必要があります。The category must be either LC_ALL or LC_CTYPE to effect a change of code page. たとえば、ホストオペレーティングシステムの既定の国/地域と言語が "米国" と "English" の場合、 setlocaleへの次の2つの呼び出しは機能的に同等になります。For example, if the default country/region and language of the host operating system are "United States" and "English," the following two calls to setlocale are functionally equivalent:

setlocale( LC_ALL, ".1252" );

setlocale( LC_ALL, "English_United States.1252");

詳細については、「C/C++ プリプロセッサ リファレンス」の setlocale pragma ディレクティブをご覧ください。For more information, see the setlocale pragma directive in the C/C++ Preprocessor Reference.

Setlocaleがプログラム内のすべてのスレッドのロケールに影響するか、呼び出し元のスレッドのロケールだけに影響するかを制御するには、関数のconfigthreadlocaleを使用します。The function _configthreadlocale is used to control whether setlocale affects the locale of all threads in a program or only the locale of the calling thread.

必要条件Requirements

ルーチンによって返される値Routine 必須ヘッダーRequired header
setlocalesetlocale <locale.h><locale.h>
_wsetlocale_wsetlocale <locale.h> または <wchar.h><locale.h> or <wchar.h>

互換性の詳細については、「 互換性」を参照してください。For additional compatibility information, see Compatibility.

Example

// crt_setlocale.c
//
// 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 in the current
// locale's format.
int get_date(unsigned char* str)
{
    __time64_t ltime;
    struct tm  thetime;

    // Retrieve the current time
    _time64(&ltime);
    _gmtime64_s(&thetime, &ltime);

    // Format the current time structure into a string
    // "%#x" is the long date representation in 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 the argument
// and prints the date.
uintptr_t __stdcall SecondThreadFunc( void* pArguments )
{
    unsigned char str[BUFF_SIZE];
    char * locale = (char *)pArguments;

    // Set the thread locale
    printf("The thread locale is now set to %s.\n",
           setlocale(LC_ALL, locale));

    // Retrieve the date string from the helper function
    if (get_date(str) == 0)
    {
        printf("The date in %s locale is: '%s'\n", locale, str);
    }

    _endthreadex( 0 );
    return 0;
}

// The main thread sets the locale to English
// and then spawns a second thread (above) and prints the date.
int main()
{
    HANDLE          hThread;
    unsigned        threadID;
    unsigned char   str[BUFF_SIZE];

    // Enable per-thread locale causes all subsequent locale
    // setting changes in this thread to only affect this thread.
    _configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

    // Set the locale of the main thread to US English.
    printf("The thread locale is now set to %s.\n",
           setlocale(LC_ALL, "en-US"));

    // Create the second thread with a German locale.
    // Our thread function takes an argument of the locale to use.
    hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc,
                                      "de-DE", 0, &threadID );

    if (get_date(str) == 0)
    {
        // Retrieve the date string from the helper function
        printf("The date in en-US 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 en-US.
The time in en-US locale is: 'Wednesday, May 12, 2004'

The thread locale is now set to de-DE.
The time in de-DE locale is: 'Mittwoch, 12. Mai 2004'

関連項目See also

ロケール名、言語、および国/地域識別文字列Locale Names, Languages, and Country/Region Strings
_configthreadlocale_configthreadlocale
_create_locale、_wcreate_locale_create_locale, _wcreate_locale
ロケールLocale
localeconvlocaleconv
_mbclen、mblen、_mblen_l_mbclen, mblen, _mblen_l
strlen、wcslen、_mbslen、_mbslen_l、_mbstrlen、_mbstrlen_lstrlen, wcslen, _mbslen, _mbslen_l, _mbstrlen, _mbstrlen_l
mbstowcs、_mbstowcs_lmbstowcs, _mbstowcs_l
mbtowc、_mbtowc_lmbtowc, _mbtowc_l
_setmbcp_setmbcp
strcoll 系関数strcoll Functions
strftime、wcsftime、_strftime_l、_wcsftime_lstrftime, wcsftime, _strftime_l, _wcsftime_l
strxfrm、wcsxfrm、_strxfrm_l、_wcsxfrm_lstrxfrm, wcsxfrm, _strxfrm_l, _wcsxfrm_l
wcstombs、_wcstombs_lwcstombs, _wcstombs_l
wctomb、_wctomb_lwctomb, _wctomb_l