std:: setlocale
|
ヘッダーで定義
<clocale>
|
||
|
char
*
setlocale
(
int
category,
const
char
*
locale
)
;
|
||
setlocale
関数は、指定されたシステムロケールまたはその一部を新しいCロケールとして設定します。この変更は、次に
setlocale
が呼び出されるまで有効であり、すべてのロケール依存のCライブラリ関数の実行に影響を与えます。
locale
がnullポインタの場合、
setlocale
は現在のCロケールを変更せずに問い合わせます。
目次 |
パラメータ
| 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ロケール名一覧 . |