質問

私の(ホーム)プロジェクトで使用すべきかどうかをまだ決定しようとしています。 UTF-8 文字列 (必要に応じて追加の UTF-8 固有関数を使用して std::string として実装) または 16 ビット文字列 (std::wstring として実装)。プロジェクトはプログラミング言語と環境です (VB のように、両方の組み合わせです)。

いくつかの要望/制約があります。

  • メモリが限られたコンピューターなど、限られたハードウェアで実行できれば素晴らしいでしょう。
  • コードを Windows、Mac、および (リソースが許せば) Linux で実行したいと考えています。
  • 使用します wxウィジェット GUI レイヤーとして使用しますが、そのツールキットと対話するコードをコードベースの隅に限定したいと考えています (非 GUI 実行可能ファイルを用意します)。
  • ユーザーに表示されるテキストとアプリケーションのデータを操作するときに、2 つの異なる種類の文字列を操作することは避けたいと考えています。

現在、必要な場合にのみ UTF-8 操作関数を使用することを目的として、std::string を使用しています。必要なメモリも少なくて済み、とにかく多くのアプリケーションがこの方向に向かっているようです。

16 ビット エンコーディングを推奨する場合は、次のいずれかを選択します。 UTF-16? UCS-2?もう一つ?

役に立ちましたか?

解決

あらゆる種類のデータ操作や UI には UTF-16 をお勧めします。Mac OS X および Win32 API は UTF-16 を使用します。これは、wxWidgets、Qt、ICU、Xerces などでも同様です。データの交換と保存には UTF-8 の方が適している可能性があります。見る http://unicode.org/notes/tn12/.

ただし、どちらを選択する場合でも、「必要な場合にのみ」UTF-8 を使用する std::string を使用しないことを強くお勧めします。

UTF-16 または UTF-8 を最後まで使用しますが、混合したり一致させたりしないでください。これはトラブルの元です。

他のヒント

UTF-16 は依然として可変長文字エンコーディング (2^16 を超える Unicode コードポイントがある) であるため、O(1) 文字列のインデックス付け操作を行うことはできません。このようなことをたくさん行っている場合、UTF-8 よりも速度が向上することはありません。一方、テキストに 256 ~ 65535 の範囲のコードポイントが多数含まれている場合は、UTF-16 によってサイズが大幅に改善される可能性があります。UCS-2 は UTF-16 のバリエーションであり、 固定長ですが、2^16 を超えるコードポイントは禁止されます。

要件について詳しく知りませんが、個人的には UTF-8 を選択するでしょう。他の人がすでに挙げたすべての理由から、これは対処するのが最も簡単です。

正直に言うと、UTF-8 以外を使用する理由は見つかりませんでした。

UTF-8 エンコードを使用する場合は、このライブラリをチェックしてください。 http://utfcpp.sourceforge.net/

それはあなたの人生をはるかに楽にするかもしれません。

私は実際に広く使用されているアプリケーション (500 万人以上のユーザー) を作成したので、文字通り、使用されるすべての KB が加算されます。それにもかかわらず、私は wxString に固執しました。std::wstring から派生するように構成したので、wstring const& を期待する関数に渡すことができます。

std::wstring は Mac のネイティブ Unicode (U+10000 を超える文字には UTF-16 は必要ありません) であるため、4 バイト/wchar_t を使用することに注意してください。この大きな利点は、i++ が常に次の文字を取得できることです。Win32 では、これは 99.9% のケースでのみ当てはまります。同じプログラマーであれば、99.9% がいかに小さいかを理解するでしょう。

ただし、納得できない場合は、std::string[UTF-8] と std::wstring を大文字にする関数を作成してください。これら 2 つの関数は、どちらが狂気であるかを示します。

ディスク上のフォーマットは別の問題です。移植性を考慮すると、UTF-8 にする必要があります。UTF-8 ではエンディアンの問題はなく、幅 (2/4) についての議論もありません。多くのプログラムが UTF-8 を使用しているように見えるのはこれが理由かもしれません。

少し関係のないメモですが、Unicode 文字列の比較と正規化について読んでください。あるいは、(目に見えない) 正規化だけが異なる 2 つの変数 föö と föö を持つことができる、.NET と同じバグが発生することになります。

MicroATX はほぼ標準的な PC マザーボード形式であり、4 ~ 8 GB の RAM を搭載できます。picoATX について話している場合、おそらく 1 ~ 2 GB の RAM に制限されています。それでも開発環境としては十分です。上記の理由により、私は依然として UTF-8 を使い続けますが、メモリについては心配する必要はありません。

私が読んだ限りでは、メモリが不足している場合を除き、内部で 16 ビット エンコーディングを使用する方が良いようです。ほぼすべての現存言語が 1 つの文字に収まります

私も見てみます ICU. 。文字列の特定の STL 機能を使用しない場合は、ICU 文字列型を使用する方が適している可能性があります。

wxStrings の使用を検討したことがありますか?私の記憶が正しければ、utf-8 <-> Unicode 変換ができるので、UI との間で文字列を受け渡しする必要がある場合に少し楽になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top