33

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

4

5 に答える 5

32

From 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 検索から始めて、まだ質問がある場合はのスタック オーバーフローの質問を開くことをお勧めします。

于 2012-08-29T03:37:46.287 に答える
24

C++ でロケールを取得する方法がわかりました。単に空文字列 "" を使用して std::locale を作成します。これは setlocale(LC_ALL, "") と同じことを行います。

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

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

于 2012-08-29T06:22:42.490 に答える