web-dev-qa-db-ja.com

私の環境の現在のロケールを取得するにはどうすればよいですか?

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でロケールを取得する方法と同じですか?

29
Deqing

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スタックオーバーフローの質問を開くことをお勧めします。

22
Dietrich Epp

C++でロケールを取得する方法を理解したところで、空の文字列 ""を使用してstd :: localeを作成します。これはsetlocale(LC_ALL、 "")と同じことを行います。

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

この link は、CロケールとC++ロケールの詳細の違いを説明しています。

19
Deqing

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.
2
Riot

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」だけが得られます。

1
zzz