質問
UTFとUCSの違いは何ですか。
C ++文字列で(UTFを使用して)ヨーロッパ以外の文字セットを表す最良の方法は何ですか。以下に関する推奨事項を知りたい:
- コード内の内部表現
- 実行時の文字列操作用
- 表示目的で文字列を使用するため。
- 最高のストレージ表現( i.e。ファイル内)
- ベストオブワイヤトランスポートフォーマット(異なるアーキテクチャ上にあり、異なる標準ロケールを持つアプリケーション間の転送)
解決
UTFとUCSの違いは何ですか。
UCSエンコーディングは固定幅で、各文字に使用されるバイト数によってマークされます。たとえば、UCS-2では文字ごとに2バイトが必要です。使用可能な範囲外のコードポイントを持つ文字は、UCSエンコードでエンコードできません。
UTFエンコーディングは可変幅で、文字を保存するための最小ビット数でマークされます。たとえば、UTF-16では、文字ごとに少なくとも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を使用します。これは、UTF-8テキストの途中にNULLバイトがないため、既存のASCIIまたはISO-8859ベースのシステムと相互運用する必要がある場合に適しています。UTF-16またはUCS-4にあります。
他のヒント
Joel Spolskyのの記事を読んでください。 Unicodeおよび文字セット(言い訳なし!)?
提案します:
- コードでの表現については、
wchar_t
または同等のもの。 - ストレージ表現の場合、UTF-8。
- ワイヤー表現の場合、UTF-8。
ストレージおよびワイヤ状況でのUTF-8の利点は、マシンのエンディアンが要因ではないことです。コードで wchar_t
などの固定サイズの文字を使用する利点は、文字列をスキャンしなくても簡単に文字列の長さを確認できることです。
UTCは協定世界時であり、文字セットではありません(UTCという文字セットは見つかりませんでした)。
内部表現では、各文字に wchar_t
を使用し、文字列にstd :: wstringを使用できます。各文字に正確に2バイトを使用するため、シークとランダムアクセスが高速になります。
ストレージの場合、データの大部分がASCIIでない(つまり、コード> = 128)場合、シリアル化された wstring
およびとほぼ同じUTF-16を使用できます。 wchar_t
。
UTF-16はリトルエンディアンまたはビッグエンディアンになる可能性があるため、ワイヤトランスポートでは、アーキテクチャに依存しないUTF-8に変換してください。
コード内の内部表現では、ヨーロッパ文字と非ヨーロッパ文字の両方に対してこれを行う方が良いでしょう:
\ uNNNN
\ u0020から\ u007Eの範囲の文字、および少しの空白(行末など)を通常の文字として書き込むことができます。 \ u0080より上にあるものは、通常の文字として記述すると、コードページでのみコンパイルされます(たとえば、フランスではOKですがロシアでは分割、ロシアではOKでも日本では分割、中国ではOKでもアメリカでは分割など) 。)。