11

C++ ロケール ファセットを使用すればするほど、理解が深まります --- それらは壊れています。

  • std::time_get-- std::time_put(C の strftime/strptime のように) 対称ではなく、AM/PM マークを使用して時刻を簡単に解析することはできません。
  • 私は最近、特定のロケール ( など) では、単純な数値の書式設定が不正な UTF-8 を生成する可能性があることを発見しru_RU.UTF-8ました。
  • std::ctypeto 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::getstrptimestd::time_put::put.

4

2 に答える 2

4

私はあなたに同意します.C++には適切なi18nサポートがありません.

C++0x の標準ファセットで何らかの変更が予想されるかどうかを知っている人はいますか?

ゲームでは遅すぎるので、おそらくそうではありません。

そのような変化の重要性をもたらす方法はありますか?

私はこれについて非常に悲観的です。

直接尋ねたところ、Stroustrup 氏は、現在の状態に問題はないと主張しました。また、別の C++ の大物 (本の著者など) は、標準を読んでも、wchar_t が 1 バイトになる可能性があることにさえ気づいていませんでした。

また、boost の一部のスレッド (これが将来の方向性を左右するようです) は、これがどのように機能するかについてほとんど理解していないため、非常に恐ろしいものです。

C++0x は、ゲームの後半で多くの苦労の末、いくつかの Unicode 文字データ型をほとんど追加しませんでした。私は息を止めていません。

より良いものを見る唯一のチャンスは、i18n と C++ の世界で本当に優れた/尊敬されている誰かが、標準の次のバージョンに直接関与することだと思います。それが誰であるかはわかりませんが:-(

于 2009-11-10T10:51:37.963 に答える
1

std::numpunctはテンプレートです。すべての特殊化は、小数点区切り文字を返そうとします。明らかに、それがワイド文字であるロケールではstd::numpunct<wchar_t><char特殊化がそれを行うことができないため、使用する必要があります。

とはいえ、C++0x はほとんど完成しています。ただし、改善が続けば、C++ 委員会は C++1x を開始する可能性があります。ISO C++ 委員会は、あなたの国の ISO メンバー組織を通じて提供された場合、あなたの支援を受け入れる可能性が非常に高いです。Pavel Minaev が Defect Report を提案したようです。それは技術的に可能ですが、あなたが説明する問題は一般的な設計上の制限です。その場合、最も信頼できるアクションは、Boost ライブラリを設計し、Boost レビューに合格させ、標準に含めるために提出し、ISO C++ 会議に参加してそこで発生する問題に対処することです。

于 2009-10-08T08:14:02.867 に答える