UTF と UCS の違いは何ですか。
C++ 文字列で (UTF を使用して) ヨーロッパ以外の文字セットを表す最良の方法は何ですか。あなたの推奨事項を知りたい:
- コード内の内部表現
- 実行時の文字列操作用
- 文字列を表示目的で使用するため。
- 最適なストレージ表現 (つまり、ファイル内)
- 最適なオン ワイヤ トランスポート形式 (異なるアーキテクチャ上にあり、異なる標準ロケールを持つアプリケーション間の転送)
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-8 を使用します。これは、既存の ASCII または ISO-8859 ベースのシステムと相互運用する必要がある場合に適しています。これは、NULL バイトが UTF-8 テキストの途中に存在しないためです。NULL バイトは UTF-16 または UCS-4 にあります。
Joel Spolsky のThe Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)に関する Joel Spolsky の記事を読みましたか?
私は提案します:
wchar_t
または同等の表現用。ストレージおよびワイヤの状況での UTF-8 の利点は、マシンのエンディアンが要因ではないことです。コードなどで固定サイズの文字を使用する利点はwchar_t
、文字列をスキャンしなくても文字列の長さを簡単に調べることができることです。
コード内の内部表現では、ヨーロッパ文字と非ヨーロッパ文字の両方に対してこれを行うことをお勧めします。
\uNNNN
\u0020 から \u007E の範囲の文字と、わずかな空白 (行末など) は通常の文字として記述できます。\u0080 より上のものは、通常の文字として記述した場合、コード ページでのみコンパイルされます (たとえば、フランスでは OK でもロシアでは壊れる、ロシアでは OK でも日本では壊れる、中国では OK でも米国では壊れる、など)。 .)。
UTC は協定世界時であり、文字セットではありません (UTC と呼ばれる文字セットは見つかりませんでした)。
内部表現にはwchar_t
、各文字に使用し、文字列には std::wstring を使用することができます。各文字に正確に 2 バイトを使用するため、シークとランダム アクセスが高速になります。
wstring
ストレージについては、ほとんどのデータが ASCII でない場合 (つまり、コード >= 128)、シリアル化されたものとほぼ同じである UTF-16 を使用することをお勧めしますwchar_t
。
UTF-16 はリトル エンディアンまたはビッグ エンディアンになる可能性があるため、ワイヤ トランスポートの場合は、アーキテクチャに依存しない UTF-8 に変換してみてください。