web-dev-qa-db-ja.com

一般的なWindowsコンパイラで使用できるstd :: locale名は何ですか?

この標準は、有効なロケール名を構成するものについてはほとんど言及していません。無効なロケール名を渡すとstd::runtime_error。 MSVC、MinGW、ICCなどの一般的なWindowsコンパイラで使用できるロケール名は何ですか?

30
Billy ONeal

必要な情報は ここ

_locale  "lang[_country_region[.code_page]]"
            | ".code_page"
            | ""
            | NULL
_

このページには、次のリンクがあります。


私の答えは_std::locale_ではなくsetlocaleをカバーしていますが、 このMSDNページ は形式が実際に同じであることを意味しているようです:

クラスlocaleのオブジェクトは、クラスstringのオブジェクトとしてロケール名も格納します。無効なロケール名を使用してロケールファセットまたはロケールオブジェクトを作成すると、クラス_runtime_error_のオブジェクトがスローされます。 Cスタイルのロケールがオブジェクトによって表されるロケールに正確に対応していることをロケールオブジェクトが確認できない場合、格納されるロケール名は「*」です。 それ以外の場合は、setlocale(LC_ALL, loc.name.c_str)を呼び出すことにより、ロケールオブジェクトlocに対して標準Cライブラリ内で一致するロケールを確立できます。

このページ および このスレッド も参照してください。これらは、_std::locale_が内部でsetlocaleを使用していることを示す傾向があります。

20
icecrime

わかりました。CロケールとC++ロケールには違いがあります。

はじめましょう:

  • MSVC C++ std :: localeおよびCsetlocale

    ロケール名を「Language [_Country] [。Codepage]」として受け入れます(例:「English_UnitedStates.1251」)。それ以外の場合はスローされます。注:コードページを65001/UTF-8にすることはできず、このロケールのANSIコードページと一致している必要があります(または省略されているだけです)。

  • Vistaおよび7のMSVCC++ std :: localeおよびCsetlocaleは、ISO-631言語コードおよびISO 3166リージョンとスクリプト名を使用して、「en-US」などのロケール[言語] [-スクリプト] [-国]を受け入れる必要があります。

    Windows7のVisualStudioでテストしましたが、機能しません。

  • MinGW C++ std :: localeは「C」と「POSIX」を受け入れ、他のロケールをサポートしません。実際、gccはGNU Cライブラリ-基本的にLinuxでのみロケールをサポートします。

    setlocaleはネイティブのWindowsAPI呼び出しであるため、上記のすべてをサポートする必要があります。

    ApachestdcxxやSTLPortなどの代替C++ライブラリと併用すると、より広範囲のロケールをサポートする可能性があります。

  • ICC-私はそれをテストしていませんが、それはそれが使用する標準C++ライブラリに依存します。たとえば、LinuxではGCCのlibstdc ++を使用していたため、gccがサポートするすべてのロケールをサポートしています。 Windowsで使用されている標準C++ライブラリがわかりません。

「コンパイラとプラットフォーム」に依存しないロケールのサポート(そして実際にははるかに優れたサポート)が必要な場合は、Boost.Localeをご覧ください。

アルチョーム

24
Artyom

ほぼどこでも使用できるロケール名は次のとおりです:_""_。つまり、空の文字列です。これは、おそらくデフォルトで取得している_"C"_ロケールとは対照的です。 std::setlocale()の引数としての空の文字列は、「ユーザーまたは環境によって設定された優先ロケールを使用する」などの意味です。これを使用する場合、欠点は、プログラムがどこでも同じ出力を持たないことです。利点は、ユーザーが希望どおりに機能すると考える可能性があることです。

10
John Zwinck