std:: setlocale
|
Определено в заголовочном файле
<clocale>
|
||
|
char
*
setlocale
(
int
category,
const
char
*
locale
)
;
|
||
Функция
setlocale
устанавливает указанную системную локаль или её часть в качестве новой C-локали. Изменения остаются в силе и влияют на выполнение всех функций стандартной библиотеки C, чувствительных к локали, до следующего вызова
setlocale
. Если
locale
является нулевым указателем,
setlocale
запрашивает текущую C-локаль без её изменения.
Содержание |
Параметры
| category | - |
идентификатор категории локали, один из макросов
LC_xxx
. Может быть
0
.
|
| locale | - | системно-специфичный идентификатор локали. Может быть "" для предпочитаемой пользователем локали или "C" для минимальной локали |
Возвращаемое значение
Указатель на узкую строку с нулевым завершением, идентифицирующую локаль C после применения изменений, если таковые имеются, или нулевой указатель в случае неудачи.
Копия возвращённой строки вместе с категорией, использованной в этом вызове
std::setlocale
, может быть позже использована в программе для восстановления локали в состояние на момент завершения этого вызова.
Примечания
Во время запуска программы, эквивалент std :: setlocale ( LC_ALL , "C" ) ; выполняется до запуска любого пользовательского кода.
Хотя возвращаемый тип - char * , изменение указываемых символов является неопределенным поведением.
Поскольку
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
для
setlocale
|
|
Внешние ссылки
| 1. | Список названий локалей Windows . |
| 2. | Список названий локалей Linux . |