4

std::string と UTF8 を扱うのはかなり複雑な問題のように思えますが、すべきこととすべきでないことの適切な説明が見つかりません。

C++ で UTF8 を適切に処理するにはどうすればよいですか? それはかなり混乱しています。

私は見つけboost::localeて、グローバルロケールを設定しました:

std::locale::global(boost::locale::generator()(""));

しかし、この後何を考えればいいのか、いつ問題が発生するのでしょうか?ファイルからの書き込み/読み取り、文字列比較などは期待どおりに機能しますか?

これまでのところ、次のことを認識しています。

  • std::regex/boost::regex動作しません。幅の広い文字列に変換して wregex を使用する必要があります。
  • boost::algorithm::to_upper動作しません、使用する必要がありますboost::locale::to_upper

それ以外に何を意識する必要がありますか?

4

1 に答える 1

3

壮大な Unicode の世界へようこそ。

  1. 申し訳ありませんが、wchar_t実装が定義されています。通常、Windows では、アジア言語のスクリプトの完全なコードポイントを保持するのに十分ではありません (たとえば)。
  2. ルックアップには比較を使用できますが、データを並べ替えて視聴者に提示するには、完全な照合アルゴリズムが必要です。たとえば、ドイツ語の辞書の順序は、ドイツ語の電話帳の順序とは異なることを知っておいてください (そして泣く...)
  3. 一般的に言えば、文字列を自分で変換しないことをお勧めします。Boost.Locale アルゴリズムは、ICUをラップするため、一般的に機能するはずですが、それ以外の場合はアドホック操作は控えてください。
  4. 文字列を複数の部分に分割する場合は、単語の途中で分割しないでください。文字を 2 つに分割するのは簡単すぎます (コードポイントを認識するアルゴリズムを使用しても、分音記号があるため)、またはそれを回避して 2 つの文字に分割することもできます (一部の文化では、隣接する文字の特定の組み合わせを 1 つと見なすため)。
于 2012-06-10T10:42:23.283 に答える