bestsource

환경의 현재 로케일을 가져오는 방법은 무엇입니까?

bestsource 2023. 10. 26. 21:18
반응형

환경의 현재 로케일을 가져오는 방법은 무엇입니까?

Linux에서 코드를 따르려고 했지만 항상 'C'를 다른 코드로 반환합니다.LANG설정.

#include <iostream>
#include <locale.h>
#include <locale>
using namespace std;

int main()
{
    cout<<"locale 1: "<<setlocale(LC_ALL, NULL)<<endl;
    cout<<"locale 2: "<<setlocale(LC_CTYPE, NULL)<<endl;

    locale l;
    cout<<"locale 3: "<<l.name()<<endl;
}

$ ./a.out
locale 1: C
locale 2: C
locale 3: C
$
$ export LANG=zh_CN.UTF-8
$ ./a.out
locale 1: C
locale 2: C
locale 3: C

Linux(Ubuntu 등)에서 현재 로케일 설정을 가져오려면 어떻게 해야 합니까?

또 다른 질문은 Windows(윈도우)에서 로케일을 가져오는 방법이 동일한가 하는 것입니다.

부터man 3 setlocale(새로운 격언: "의심스러울 때는 맨페이지 전체를 읽으십시오."):

로케일의 경우"", 수정해야 할 로케일의 각 부분은 환경 변수에 따라 설정됩니다.

그래서 우리는 호출을 통해 환경 변수를 읽을 수 있습니다.setlocale다음과 같이 프로그램을 시작할 수 있습니다.

#include <iostream>
#include <locale.h>
using namespace std;

int main()
{
    setlocale(LC_ALL, "");
    cout << "LC_ALL: " << setlocale(LC_ALL, NULL) << endl;
    cout << "LC_CTYPE: " << setlocale(LC_CTYPE, NULL) << endl;
    return 0;
}

시스템이 지원하지 않습니다.zh_CN다음 출력에서 알 수 있듯이 로케일.

$ ./a. 밖으로LC_ALL: en_US.utf8LC_CTYPE : en_US.utf8$ 내보내기 LANG=zh_CN.UTF-8$ ./a. 밖으로LC_ALL: CLC_CTYPE: C

Windows:Windows 로케일에 대해서는 전혀 모릅니다.MSDN 검색부터 시작해서 질문이 있을 경우 별도의 Stack Overflow 질문을 여는 것을 권장합니다.

방금 C++로 로케일을 가져오는 방법을 찾았습니다. std::locale을 구성하기 위해 빈 문자열 ""을 사용하면 setlocale(LC_ALL, ")과 동일한 작업을 수행합니다.

locale l("");
cout<<"Locale by C++: "<<l.name()<<endl;

링크에서는 C 로케일과 C++ 로케일 간의 세부 정보 차이를 설명했습니다.

Windows의 경우 다음 코드를 사용합니다.

LCID lcid = GetThreadLocale();
wchar_t name[LOCALE_NAME_MAX_LENGTH];
if (LCIDToLocaleName(lcid, name, LOCALE_NAME_MAX_LENGTH, 0) == 0)
    error(GetLastError());
std::wcout << L"Locale name = " << name << std::endl;

이것은 "en-US"와 같은 것을 인쇄할 것입니다.

하위 언어 정보를 삭제하려면 다음을 사용합니다.

wchar_t parentLocateName[LOCALE_NAME_MAX_LENGTH];
if (GetLocaleInfoEx(name, LOCALE_SPARENT, parentLocateName, LOCALE_NAME_MAX_LENGTH) == 0)
    error(GetLastError());
std::wcout << L"parentLocateName = " << parentLocateName << std::endl;

이렇게 하면 그냥 "en"이 나옵니다.

std:: locale는 부스트:: 보다 신뢰할 수 있는 정보를 반환할 수 있는 locale을 고려하는 것이 좋습니다 - http://www.boost.org/doc/libs/1_52_0/libs/locale/doc/html/locale_information.html 를 참조하십시오.

boost::locale::info는 다음과 같은 멤버 기능을 가지고 있습니다.

std::string name() -- the full name of the locale, for example en_US.UTF-8
std::string language() -- the ISO-639 language code of the current locale, for example "en".
std::string country() -- the ISO-3199 country code of the current locale, for example "US".
std::string variant() -- the variant of current locale, for example "euro".
std::string encoding() -- the encoding used for char based strings, for example "UTF-8"
bool utf8() -- a fast way to check whether the encoding is UTF-8.

기본 생성자std::locale는 글로벌 C++ 로케일의 복사본을 만듭니다.

현재 로케일의 이름을 가져오려면:

std::cout << std::locale().name() << '\n';

언급URL : https://stackoverflow.com/questions/12170488/how-to-get-current-locale-of-my-environment

반응형