6

UTF と UCS の違いは何ですか。

C++ 文字列で (UTF を使用して) ヨーロッパ以外の文字セットを表す最良の方法は何ですか。あなたの推奨事項を知りたい:

  • コード内の内部表現
    • 実行時の文字列操作用
    • 文字列を表示目的で使用するため。
  • 最適なストレージ表現 (つまり、ファイル内)
  • 最適なオン ワイヤ トランスポート形式 (異なるアーキテクチャ上にあり、異なる標準ロケールを持つアプリケーション間の転送)
4

5 に答える 5

8

UTF と UCS の違いは何ですか。

UCS エンコーディングは固定幅で、各文字に使用されるバイト数によってマークされます。たとえば、UCS-2 では 1 文字あたり 2 バイトが必要です。使用可能な範囲外のコード ポイントを持つ文字は、UCS エンコーディングでエンコードできません。

UTF エンコーディングは可変幅で、文字を格納する最小ビット数でマークされます。たとえば、UTF-16 では、1 文字あたり少なくとも 16 ビット (2 バイト) が必要です。大きなコード ポイントを持つ文字は、より多くのバイト数 (UTF-16 のアストラル文字の場合は 4 バイト) を使用してエンコードされます。

  • コード内の内部表現
  • 最適なストレージ表現 (つまり、ファイル内)
  • 最適なオン ワイヤ トランスポート形式 (異なるアーキテクチャ上にあり、異なる標準ロケールを持つアプリケーション間の転送)

最新のシステムでは、最も妥当なストレージおよびトランスポート エンコーディングは UTF-8 です。古いメール サーバーには UTF-7、よく書かれていないテキスト エディタには UTF-16 など、他の方法が適切な特殊なケースもありますが、UTF-8 が最も一般的です。

推奨される内部表現は、プラットフォームによって異なります。Windows では UTF-16 です。UNIX では、UCS-4 です。それぞれに良い点があります。

  • UTF-16 文字列は、UCS-4 文字列より多くのメモリを使用することはありません。主に基本多言語面 (BMP) に文字を含む多くの大きな文字列を格納する場合、UTF-16 は UCS-4 よりもはるかに少ないスペースしか必要としません。BMP の外では、同じ量が使用されます。
  • UCS-4 の方が推論が容易です。UTF-16 文字は複数の「サロゲート ペア」に分割される可能性があるため、文字列を正しく分割またはレンダリングするのは難しい場合があります。UCS-4 テキストにはこの問題はありません。また、UCS-4 は「char」配列の ASCII テキストのように機能するため、既存のテキスト アルゴリズムを簡単に移植できます。

最後に、一部のシステムは内部形式として UTF-8 を使用します。これは、既存の ASCII または ISO-8859 ベースのシステムと相互運用する必要がある場合に適しています。これは、NULL バイトが UTF-8 テキストの途中に存在しないためです。NULL バイトは UTF-16 または UCS-4 にあります。

于 2008-10-14T06:17:45.723 に答える
3

Joel Spolsky のThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)に関する Joel Spolsky の記事を読みましたか?

于 2008-10-14T05:46:34.070 に答える
2

私は提案します:

  • コードwchar_tまたは同等の表現用。
  • ストレージ表現の場合、UTF-8。
  • ワイヤー表現の場合、UTF-8。

ストレージおよびワイヤの状況での UTF-8 の利点は、マシンのエンディアンが要因ではないことです。コードなどで固定サイズの文字を使用する利点はwchar_t、文字列をスキャンしなくても文字列の長さを簡単に調べることができることです。

于 2008-10-14T05:42:55.340 に答える
0

コード内の内部表現では、ヨーロッパ文字と非ヨーロッパ文字の両方に対してこれを行うことをお勧めします。

\uNNNN

\u0020 から \u007E の範囲の文字と、わずかな空白 (行末など) は通常の文字として記述できます。\u0080 より上のものは、通常の文字として記述した場合、コード ページでのみコンパイルされます (たとえば、フランスでは OK でもロシアでは壊れる、ロシアでは OK でも日本では壊れる、中国では OK でも米国では壊れる、など)。 .)。

于 2008-10-14T07:02:07.443 に答える
0

UTC は協定世界時であり、文字セットではありません (UTC と呼ばれる文字セットは見つかりませんでした)。

内部表現にはwchar_t、各文字に使用し、文字列には std::wstring を使用することができます。各文字に正確に 2 バイトを使用するため、シークとランダム アクセスが高速になります。

wstringストレージについては、ほとんどのデータが ASCII でない場合 (つまり、コード >= 128)、シリアル化されたものとほぼ同じである UTF-16 を使用することをお勧めしますwchar_t

UTF-16 はリトル エンディアンまたはビッグ エンディアンになる可能性があるため、ワイヤ トランスポートの場合は、アーキテクチャに依存しない UTF-8 に変換してみてください。

于 2008-10-14T05:42:42.550 に答える