Namespaces
Variants

std:: setlocale

From cppreference.net
헤더 파일에 정의됨 <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" 로 명명된 locale을 정의하며, 이는 항상 접근 가능하고 기본 최소 "C" locale과 완전히 동일합니다.

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 을 위한 locale 카테고리
(매크로 상수)
문화적 차이를 캡슐화하는 다형성 패싯들의 집합
(클래스)
C 문서 for setlocale

외부 링크

1. Windows 로캘 이름 목록 .
2. Linux 로캘 이름 목록 .