如何获取我的环境的当前区域设置?

时间:2012-08-29 03:29:10

标签: c++ c locale

曾尝试在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中获取区域设置的方式是否相同?

5 个答案:

答案 0 :(得分:21)

来自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.out 
LC_ALL: en_US.utf8
LC_CTYPE: en_US.utf8
$ export LANG=zh_CN.UTF-8
$ ./a.out 
LC_ALL: C
LC_CTYPE: C

Windows:我不了解Windows区域设置。我建议从MSDN search开始,然后打开单独的 Stack Overflow问题,如果您仍有疑问。

答案 1 :(得分:19)

刚刚想出如何通过C ++获取语言环境,只需使用空字符串“”来构造std :: locale,它与setlocale(LC_ALL,“”)的作用相同。

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

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

答案 2 :(得分:2)

考虑代替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.

答案 3 :(得分:1)

对于Windows,请使用以下代码:

var url = "https://www.google.com?q=searchKeyword";

这将打印“ en-US”之类的内容。

要清除子语言信息,请使用以下命令:

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

答案 4 :(得分:0)

std::locale的{​​{3}}创建全局C ++语言环境的副本。

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

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