33

曾在 Linux 中尝试过以下代码,但总是在不同的LANG设置下返回“C”。

#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 中获取语言环境的方法是否相同?

4

5 回答 5

32

来自man 3 setlocale(新格言:“如有疑问,请阅读整个手册页。”):

如果 locale 是"",则需要修改的 locale 的每一部分都根据环境变量进行设置。

所以,我们可以通过在程序开头调用来读取环境变量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.out
LC_ALL:en_US.utf8
LC_CTYPE:en_US.utf8
$ 出口 LANG=zh_CN.UTF-8
$ ./a.out
LC_ALL:C
LC_CTYPE:C

Windows:我对 Windows 语言环境一无所知。我建议从MSDN 搜索开始,如果您仍有疑问,请打开一个单独的 Stack Overflow 问题。

于 2012-08-29T03:37:46.287 回答
24

刚刚想通了如何通过C++获取locale,只需使用一个空字符串“”来构造std::locale,它的作用和setlocale(LC_ALL, "")是一样的。

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

链接描述了 C 语言环境和 C++ 语言环境之间的细节差异。

于 2012-08-29T06:22:42.490 回答
4

对于 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”。

于 2018-12-17T10:25:17.370 回答
3

一个很好的替代 std::locale 的替代方法是 boost::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.
于 2015-07-12T20:13:11.617 回答
1

默认构造函数创建全局 C++ 语言环境的std::locale副本。

因此,要获取当前语言环境的名称:

std::cout << std::locale().name() << '\n';
于 2020-04-21T09:09:59.807 回答