4

大規模なコード ベースを持つ既存のアプリケーションに UTF8 のサポートを追加します。このアプリケーションは を使用してboost::format()おり、ASCII 以外の文字の出力が正しく配置されていません。具体的には、%{width}.{length}s 指定子を使用する場合、boost::format()文字をカウントしますが、これは utf8 文字列で「正しいことを行いません」。文字列の長さのコード (おそらく string::size()) を使用するか、それに似たものに変更することは可能だと思いますutf8len()... 何かに基づいて?

この場合、UCS2 (または UCS4、UTF-16 など) を使用するように既存のコード ベースを変更することは現実的ではありませんが、boost::format()必要に応じて変更することは可能です。他の誰かがこの必要性に出くわし、可能な解決策を教えてくれることを願っていました.

注: utf8 でのロケールの使用に関する Web ページをいくつか見つけましたが、そのほとんどは、ストリームでの utf8 および UCS4 との間の変換により適しているように思われました。

4

2 に答える 2

1

これはおそらくあなたには遅すぎますが、他の誰かを助けるかもしれません. Boost::format は、オプションのテンプレート パラメータとして std::locale を受け入れます。( http://www.boost.org/doc/libs/1_55_0/libs/format/doc/format.htmlを参照)。boost::locale("en_US.UTF-8") などの Unicod 対応ロケールを渡すと、目的の動作が得られるはずです。

ロケールを毎回 boost::format コンストラクターに渡す代わりに、アプリケーションのデフォルトのロケールを設定することもできます。これは、他の問題を回避するのに役立つ場合があります。このルートを使用する場合は、std::locale よりも boost::locale を使用することをお勧めします。明示的に要求しない限り、boost::locale は数値の書式設定を変更しないためです (docs here )。

一般に、これは C++ のアプリケーションを Unicode とうまく連携させるための goto アプローチです。機能がロケール (std::regex、std::sort、boost::format) を使用できる場合は、Unicode 対応のロケールを指定してください。安全である必要があります (そうでない場合は教えてください。知りたいです) )。

小規模で軽量なアプリケーションを作成していて、80% のケースだけを気にする場合は、unicode サポートを提供するときにデフォルトのエンジン ブースト ロケールがラップする ICU (Unicode 用の国際コンポーネント) を含めるための代償を払いたくない場合があります。この場合、OS または Posix Unicode サポートを使用して Boos をビルドすると、アプリケーションは小さくて軽いままになりますが、複数の照合レベルなど、多くの Unicode サポートはありません。

あなたが説明している問題については、おそらくPosixサポートで十分です。

于 2015-08-21T11:49:09.773 に答える