12

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

いくつかの希望/制約があります:

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

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

16 ビット エンコーディングを推奨する場合、UTF-16はどれですか? UCS-2 ? もう一つ?

4

8 に答える 8

26

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

あなたの要件について詳しく知らなくても、私は個人的に UTF-8 を選びます。他の人がすでにリストしたすべての理由から、これは最も簡単に対処できます。

于 2008-09-19T16:46:41.143 に答える
6

正直なところ、UTF-8 以外を使用する理由は見当たりませんでした。

于 2008-09-19T16:23:05.270 に答える
5

UTF-8 エンコーディングを使用する場合は、次のライブラリを確認してください: http://utfcpp.sourceforge.net/

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

于 2008-09-19T17:39:18.973 に答える
4

私は実際に広く使用されているアプリケーション(500万人以上のユーザー)を作成したので、使用されるキロバイトごとに文字通り合計されます。それにもかかわらず、私は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文字列の比較と正規化について読んでください。または、.NETと同じバグが発生し、2つの変数fööとfööが(非表示の)正規化のみが異なる可能性があります。

于 2008-09-21T23:26:16.063 に答える
2

あらゆる種類のデータ操作とUIにはUTF-16をお勧めします。Mac OSXおよびWin32APIは、wxWidgets、Qt、ICU、Xercesなどで同じUTF-16を使用します。UTF-8は、データの交換と保存に適している可能性があります。http://unicode.org/notes/tn12/を参照してください。

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

UTF-16またはUTF-8を最後まで使用しますが、組み合わせないでください。問題が発生します。

于 2008-09-19T16:33:57.493 に答える
2

MicroATXは、ほぼ標準のPCマザーボード形式であり、ほとんどの場合4〜8GBのRAMに対応しています。picoATXについて話している場合は、RAMが1〜2GBに制限されている可能性があります。それでも、開発環境にはこれで十分です。上記の理由で私はまだUTF-8を使い続けますが、メモリはあなたの関心事ではありません。

于 2008-09-19T16:39:54.780 に答える
1

私が読んだところによると、メモリが不足していない限り、内部で 16 ビット エンコーディングを使用することをお勧めします。ほぼすべての生きている言語に 1 文字で収まります

ICUも検討します。文字列の特定の STL 機能を使用しない場合は、ICU 文字列型を使用することをお勧めします。

于 2008-09-19T16:23:03.837 に答える
0

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

于 2008-09-19T17:04:33.457 に答える