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など)で現在のロケール設定を取得するにはどうすればよいですか?
もう1つの質問は、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.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 から始めて、separateスタックオーバーフローの質問を開くことをお勧めします。
C++でロケールを取得する方法を理解したところで、空の文字列 ""を使用してstd :: localeを作成します。これはsetlocale(LC_ALL、 "")と同じことを行います。
locale l("");
cout<<"Locale by C++: "<<l.name()<<endl;
この link は、CロケールとC++ロケールの詳細の違いを説明しています。
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.
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」だけが得られます。