Unicodeは、各文字に整数を割り当てるだけです。UTF-8などは、これらの整数(「コードポイント」)をメモリに格納される一連のバイトにエンコードするために使用されます。私の質問は、なぜ文字をそのUnicode値(「コードポイント」)のバイナリ表現として単純に格納できないのかということです。したがって、一部の言語には、それらを表すために複数のバイトを必要とする文字があります。コードポイントのバイナリと同じように保存する方が簡単ではありませんか?
3 に答える
はい、できます。それがUTF-32です。
問題は、UTF-32が多くのスペースを浪費することです。テキストにヨーロッパ/ヘブライ語/アラビア語のテキストが多数含まれている場合、UTF-8ではコードポイントあたり1〜2バイトしかかかりませんが、UTF-32ではコードポイントあたり4バイトかかります。
整数値を変数サイズとして格納する場合、たとえば0〜255は1バイトを使用し、256〜65535は2バイトを使用するなど、あいまいさの問題が発生します。たとえば、5a 5a
「ZZ」または「婚」を表す必要がありますか?基本的に、解決策はUTF-8と呼ばれるものです。バイトシーケンスの長さを示すためにいくつかの特別なビットを使用して、一意のデコード結果を提供します。
これらのコードポイントをどの程度正確に保存しますか?1バイトに収まるコードポイントもあれば、3バイトが必要なコードポイントもあります。各コードポイントごとに4バイトを使用しますか?バイトストリームを見ると、1つのコードポイントがどこで終わり、もう1つのコードポイントがどこで始まるかをどうやって知ることができますか?UTF-8(およびその他のエンコーディング)は、その答えを提供します。
まず、それらを生のコードポイントとして保存する方法があります。それはUTF-32またはUCS-4です。各文字は常に4バイトであり、各コードポイントを変更せずに格納します。
ただし、UTF-8などの他のものを使用する理由は次のとおりです。
- ASCII互換性:U +0000のみを含むファイル-U+007fはまったく変更する必要はありません
- サイズ効率:UTF-8は通常、はるかに小さなファイルになります