Как получить текущий язык моей среды?
Пробовал следующий код в 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?
Ответы
Ответ 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, а затем открыть отдельный вопрос, если у вас все еще есть вопросы.
Ответ 2
Просто выяснилось, как получить язык на С++, просто используйте пустую строку "для построения std:: locale, что делает то же самое, что и setlocale (LC_ALL," ").
locale l("");
cout<<"Locale by C++: "<<l.name()<<endl;
Эта ссылка описала различия в деталях между языками языка C и языками С++.
Ответ 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;
Это даст вам просто "ан".