C++ ロケール ファセットを使用すればするほど、理解が深まります --- それらは壊れています。
std::time_get
--std::time_put
(C の strftime/strptime のように) 対称ではなく、AM/PM マークを使用して時刻を簡単に解析することはできません。- 私は最近、特定のロケール ( など) では、単純な数値の書式設定が不正な UTF-8 を生成する可能性があることを発見し
ru_RU.UTF-8
ました。 std::ctype
to upper/to lower が文字ごとに実行できると仮定すると、非常に単純化されています (大文字と小文字の変換により文字数が変わる可能性があり、コンテキストに依存します)。std::collate
-- 照合強度 (大文字と小文字を区別するか区別しないか) をサポートしていません。- 時刻のフォーマットでグローバル タイムゾーンとは異なるタイムゾーンを指定する方法はありません。
そして、はるかに...
- C++0x の標準ファセットで何らかの変更が予想されるかどうかを知っている人はいますか?
- そのような変化の重要性をもたらす方法はありますか?
ありがとう。
編集:リンクにアクセスできない場合の説明:
std::numpunct
桁区切り記号を char として定義します。そのため、U+2002 のセパレーターの場合、異なる種類のスペースは、UTF-8 では単一の文字として再現できず、複数のバイト シーケンスとして再現できません。
C APIstruct lconv
では、3 桁区切りを文字列として定義しているため、この問題は発生しません。そのため、UTF-8 ロケールで ASCII 以外のセパレーターを使用して数値をフォーマットしようとすると、無効な UTF-8 が生成されます。
ru_RU.UTF-8
このバグを再現するには、ロケールが埋め込まれた std:ostream に 1234 を書き込みます
EDIT2: POSIX C ローカリゼーション API の方がはるかにスムーズに動作することを認めなければなりません。
- strftime の逆があります -- strptime (strftime は と同じです
std::time_put::put
) - 上記の点により、数値の書式設定に問題はありません。
しかし、それはまだ完璧であるためです。
EDIT3: C++0x に関する最新のメモによるstd::time_get::get
とstrptime
、std::time_put::put
.