クロスプラットフォームでの Unicode 文字列の使用に関する無数のディスカッション スレッドがありますが、私が取り組んでいる特定のプロジェクトで私を悩ませてきたいくつかの特定の懸念に対処することなく、幅広い意見があるようです。
私は、ほぼ 20 年前にさかのぼる大規模なクロスプラットフォーム C++ コード ベースを持っています。以下を含む、あらゆる種類の文字列実装の寄せ集めが含まれています。
char*
- Pascal スタイルの文字列
std::string
- 機能が重複する複数のカスタム クロスプラットフォーム クラス
CFString
- あらゆる種類の定数文字列
このコード ベースは、モデルが完全に移植可能 (Mac OS / IOS / Android / Windows 7 & 8 / Unix) になることを期待して、完全に Unicode 文字列を使用し、強力な MVC アーキテクチャを実装するように書き直されているところです。
永続データが XML/UTF-8 として書き込まれている間、実行時オブジェクトでの文字列の使用に関していくつかのジレンマがあります。
ストレージ、割り当て、および一般的な文字列操作の実装をきれいに隠すクラスを作成したいと考えています。C++ 演算子と代入のオーバーロードの奇跡を通して、関数が受け入れることができるすべての異なる文字列パラメーターをクラス インスタンスに置き換えることができるようになることを願っています。これにより、コード ベースの増分変換が可能になります。
私たちは常に文字列をスキャン/解析/分析していますが、永続オブジェクトに厳密に UTF-8 の基本実装を使用すると、パフォーマンスの問題が発生する可能性があるのではないかと心配しています。そうでない場合、Microsoft の VC++ と GNU の G++ にある最新の std::string は、単純な基本実装になるのでしょうか?
Mac OS / IOS バージョンでは、最終的に文字列を CFString に「変換」する必要があります。CF 機能は豊富で、高度に最適化されています。
CFStringCreateWithCharactersNoCopy
CF にバッファ (たとえば、または)を提供して、独自のクラスで CFString を作成するのは良い戦略だと思いますCFStringCreateMutableWithExternalCharactersNoCopy
。これにより、モデルからデータを取得した後に CFString が通常必要とする変換/割り当ての量を減らすことができるように思えます — おそらく適切な MVC 実装では、コントローラー/ビューはモデルが所有する実際の文字列にアクセスするべきではありませんか?C++ 11 は、これらのクロスプラットフォーム文字列の問題の状況を変えますか?
これらの問題はずっと前に解決されているはずだと私は推測していましたが、このサイト (および他のサイト) の回答を確認しても、解決したとは思えません。