Подтвердить что ты не робот

Как получить текущий язык моей среды?

Пробовал следующий код в 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?

4b9b3361

Ответ 1

От man 3 setlocale (Новая максима: "Если вы сомневаетесь, прочитайте всю справочную страницу".):

Если 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
$ export LANG=zh_CN.UTF-8
$ ./a.out 
LC_ALL: C
LC_CTYPE: C

Windows: Я понятия не имею о локалях Windows. Я предлагаю начать с поиск MSDN, а затем открыть отдельный вопрос, если у вас все еще есть вопросы.

Ответ 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.

Ответ 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;

Это даст вам просто "ан".