この標準は、有効なロケール名を構成するものについてはほとんど言及していません。無効なロケール名を渡すとstd::runtime_error
。 MSVC、MinGW、ICCなどの一般的なWindowsコンパイラで使用できるロケール名は何ですか?
必要な情報は ここ :
_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
を使用していることを示す傾向があります。
わかりました。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をご覧ください。
アルチョーム
ほぼどこでも使用できるロケール名は次のとおりです:_""
_。つまり、空の文字列です。これは、おそらくデフォルトで取得している_"C"
_ロケールとは対照的です。 std::setlocale()
の引数としての空の文字列は、「ユーザーまたは環境によって設定された優先ロケールを使用する」などの意味です。これを使用する場合、欠点は、プログラムがどこでも同じ出力を持たないことです。利点は、ユーザーが希望どおりに機能すると考える可能性があることです。