2

locale私はC++11によって提供される新しいもののいくつかをテストstd::put_moneyしていて、それらの使用に慣れたいと思っていました。標準ライブラリでサポートされているすべての国の通貨として印刷された多数の数字を表示するとよいと思いました。

const char *Locales[] =
{
    "English_Australia.1252",
    "en_EN",
    "fr_FR.UTF-8"
    / ...
    // lots of lots of worldwide locales
};

int main(int argc, char **argv)
{
    for (const char **Locale = std::begin(Locales); Locale != std::end(Locales); ++Locale)
    {
        std::stringstream ss;
        ss.imbue(std::locale(*Locale))

        std::cout << *Locale << ' '
                  << std::showbase << std::put_money(11223344556677889900) << '\n';
    }
}

ロケール名がまったく標準ではないことに気付いたとき、私はショックを受けました。Windows7 Professional(SP1)(スペイン語ロケールマシン)でのVisual Studio 10.0の場合、ロケール名は次の形式Language_Region.charsetIDに従います。たとえばEnglish_Australia.1252、Linuxマシン(Debian 4.2 .2)gcc 4.2.3では、ロケールは同じ形式に従いますが、2文字xx_XX.UTF-8(たとえばes_ES.UTF-8)であり、Ideoneでコードを試している間、受け入れられると思われるロケールは。だけですen_US.UTF-8

最も苛立たしい部分は、サポートされているロケールの標準のクロスプラットフォームテーブルを取得しようとすることです。グーグルで見つけた最高のものは、Windowsのロケールと、Windowsがない場合の同等のロケールを一覧表示するものですが、国(米国、グアテマラ、メキシコなど)。

私が試したもう1つのことは、std::localeどのロケール名が有効でどれが無効であるかを示すコードを見つけることを期待して、コンストラクターを段階的にデバッグすることです。ロケール名の巨大な配列(サンプルコードのようなもの)を期待していましたが、std::localeコンストラクターの複雑さに怯えて逃げました。

だから私の質問は:

  • あなたが知っていて使用しているクロスプラットフォームロケールの最良かつ最も完全な表はどれですか?
  • 実行中のシステムでサポートされているロケールを知る方法は?サポートされているロケールリストにアクセスするにはどうすればよいですか?

追加の質問:

  • ロケール名が標準ではないのはなぜですか(クロスプラットフォームのソースコードを許可する)?
  • Ideoneが使用しているロケールシステムはどれですか?
4

1 に答える 1

3

UNIX-yシステムでは、を実行してロケールのリストを取得します。locale -aこれは、によっても推奨されman setlocaleます。Cライブラリにはロケールのリストさえあるとは思いません。実行時にロケールを検索するから/usr/lib/localeです。

本質的に、これは、ターゲットシステムのランタイム機能であるため、コンパイル時にロケールリストを知ることができないことを意味します。

于 2013-02-12T14:57:10.343 に答える