Namespaces
Variants

std:: setlocale

From cppreference.net
Определено в заголовочном файле <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
(макроконстанта)
набор полиморфных фасадов, инкапсулирующих культурные различия
(класс)

Внешние ссылки

1. Список названий локалей Windows .
2. Список названий локалей Linux .