Namespaces
Variants

std:: setlocale

From cppreference.net
ヘッダーで定義 <clocale>
char * setlocale ( int category, const char * locale ) ;

setlocale 関数は、指定されたシステムロケールまたはその一部を新しいCロケールとして設定します。この変更は、次に setlocale が呼び出されるまで有効であり、すべてのロケール依存のCライブラリ関数の実行に影響を与えます。 locale がnullポインタの場合、 setlocale は現在のCロケールを変更せずに問い合わせます。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - C++関連の用語(Parameters、Return value、Notes、Example、See also、External links)は翻訳せず、原文のまま保持しました - HTMLタグ、属性、クラス名、ID、リンク先は一切変更していません - 数値や書式設定は完全に保持されています

パラメータ

category - ロケールカテゴリ識別子、 LC_xxx マクロのいずれか。 0 の場合もある。
locale - システム固有のロケール識別子。ユーザー優先ロケールの場合は "" 、最小ロケールの場合は "C" を指定可能

戻り値

Cロケールを識別するナローナル終端文字列へのポインタ(変更が適用された場合)、または失敗時にはヌルポインタ。

返却された文字列のコピーと、この呼び出しで使用されたカテゴリは、プログラムの後続処理で std::setlocale を使用してロケールをこの呼び出し終了時の状態に復元するために使用される可能性があります。

注記

プログラム起動時、ユーザーコードが実行される前に、 std :: setlocale ( LC_ALL , "C" ) ; と同等の処理が実行されます。

戻り値の型は char * ですが、指し示す文字を変更することは未定義動作です。

setlocale はロケール依存関数の実行に影響を与えるグローバル状態を変更するため、あるスレッドが以下の関数のいずれかを実行中に、別のスレッドから setlocale を呼び出すことは未定義動作となります: std::fprintf , std::isprint , std::iswdigit , std::localeconv , std::tolower , std::fscanf , std::ispunct , std::iswgraph , std::mblen , std::toupper , std::isalnum , std::isspace , std::iswlower , std::mbstowcs , std::towlower , std::isalpha , std::isupper , std::iswprint , std::mbtowc , std::towupper , std::isblank , std::iswalnum , std::iswpunct , std::setlocale , std::wcscoll , std::iscntrl , std::iswalpha , std::iswspace , std::strcoll , std::wcstod , std::isdigit , std::iswblank , std::iswupper , std::strerror , std::wcstombs , std::isgraph , std::iswcntrl , std::iswxdigit , std::strtod , std::wcsxfrm , std::islower , std::iswctype , std::isxdigit .

POSIXはまた、 "POSIX" という名前のロケールも定義しており、これは常にアクセス可能で、デフォルトの最小限の "C" ロケールと完全に等価です。

POSIXは、返されるポインタだけでなく、指し示される文字列の内容も、後続の setlocale の呼び出しによって無効化される可能性があることを規定しています。

#include <clocale>
#include <cstdio>
#include <ctime>
#include <cwchar>
#include <iterator>
#include <string>
int main()
{
    // 現在のロケール名の「ディープコピー」を作成
    std::string prev_loc = std::setlocale(LC_ALL, nullptr);
    // CロケールはUTF-8有効の英語に設定され、
    // 小数点はドイツ語形式に、
    // 日付と時刻の書式は日本語形式になる
    if (const char* loc = std::setlocale(LC_ALL, "en_US.UTF-8"))
        std::wprintf(L"New LC_ALL locale: %s\n", loc);
    if (const char* loc = std::setlocale(LC_NUMERIC, "de_DE.UTF-8"))
        std::wprintf(L"New LC_NUMERIC locale: %s\n", loc);
    if (const char* loc = std::setlocale(LC_TIME, "ja_JP.UTF-8"))
        std::wprintf(L"New LC_TIME locale: %s\n", loc);
    wchar_t buf[100];
    std::time_t t = std::time(nullptr);
    std::wcsftime(buf, std::size(buf), L"%A %c", std::localtime(&t));
    std::wprintf(L"Number: %.2f\nDate: %Ls\n", 3.14, buf);
    // 以前のロケールを復元
    if (const char* loc = std::setlocale(LC_ALL, prev_loc.c_str()))
        std::wprintf(L"Restorred LC_ALL locale: %s\n", loc);
}

出力例:

New LC_ALL locale: en_US.UTF-8
New LC_NUMERIC locale: de_DE.UTF-8
New LC_TIME locale: ja_JP.UTF-8
Number: 3,14
Date: 日曜日 2022年11月06日 20時40分59秒
Restorred LC_ALL locale: C

関連項目

std::setlocale のロケールカテゴリ
(マクロ定数)
文化的差異をカプセル化する多相的なファセットの集合
(クラス)
Cドキュメント for setlocale

外部リンク

1. Windowsロケール名一覧 .
2. Linuxロケール名一覧 .