1. ホーム
  2. unicode

[解決済み] UTF-8とUnicodeの違いは何ですか?

2022-03-16 04:32:16

質問

という相反する意見を聞いたことがあります。 ウィキペディア UTF-8 のページをご覧ください。

同じものなんですよね?誰かはっきりさせてくれませんか?

解決方法は?

他の人が出した答えを拡大解釈すること。

コンピュータが理想的に表示すべき文字は、たくさんの言語があり、たくさんの文字があります。ユニコードでは、それぞれの文字に固有の番号、つまりコードポイントを割り当てています。

コンピュータはこのような数値をバイトとして扱います。ここで少し歴史を飛ばして、メモリアドレスの問題を無視すると、8ビットコンピュータは8ビットバイトをハードウェア上で簡単に表現できる最大の数値単位として扱い、16ビットコンピュータはそれを2バイトに拡張する、というようになります。

ASCIIなどの古い文字エンコーディングは8ビット以前のもので、当時のコンピュータで主流の言語である英語を0から127までの数字(7ビット)に詰め込もうとしています。アルファベット26文字、大文字と小文字、数字、句読点で構成され、うまく機能した。ASCIIは英語以外の言語のために8ビット拡張されましたが、この拡張によって利用可能になった128個の数字/コードポイントは、表示する言語によって異なる文字にマッピングされることになりました。ISO-8859-1 と ISO-8859-15 (ISO-Latin-1、latin1 としても知られ、ISO 8859 規格にも 2 つのバージョンがあります) は、このマッピングの最も一般的な形式です。

しかし、複数の言語の文字を表現したい場合、1バイトにすべての文字を詰め込んでもうまくいかない。

エンコーディングには基本的に2種類あり、1つはビットを追加して値の範囲を広げるものです。これらのエンコーディングの例は、UCS2(2バイト=16ビット)とUCS4(4バイト=32ビット)です。これらのエンコーディングは、ASCII や ISO-8859 規格と本質的に同じ問題を抱えており、たとえ制限が非常に高くなったとしても、値の範囲は制限されたままです。

もう一つのタイプは、1文字あたり可変のバイト数を使用するエンコーディングで、これについてはUTFエンコーディングが最も一般的に知られています。UTF-8 は 8 ビット、UTF-16 は 16 ビット、UTF-32 は 32 ビ ッ ト の単位を選びます。もしそれらが設定されていれば、一連のユニットの中で次のユニットは同じ文字の一部とみなされます。もしフラグがセットされていなければ、このユニットは完全に1文字を表します。したがって、最も一般的な(英語の)文字は、UTF-8では1バイト(UTF-16では2バイト、UTF-32では4バイト)しか占有しませんが、他の言語の文字は6バイト以上占有することがあります。

マルチバイト符号化(以上の説明からマルチユニットと呼ぶべきでしょう)は、比較的スペース効率が良いという利点がありますが、部分文字列の検索や比較などの操作を行う前に、すべて文字をユニコードのコードポイントにデコードしなければならないという欠点があります(ただし、いくつかの近道があります)。

UCS 規格も UTF 規格も、Unicode で定義されたコードポイントをエンコードしています。理論的には、これらのエンコーディングは、(エンコーディングがサポートする範囲内で)どんな数字でもエンコードすることができます - しかし、もちろん、これらのエンコーディングは、Unicodeのコードポイントをエンコードするために作られました。そして、それがあなたの両者の関係です。

Windows では、いわゆる "Unicode" の文字列は UTF-16 の文字列として扱われますが、最近のほとんどの UNIX では UTF-8 がデフォルトになっています。UTF-8 の単位サイズは ASCII と同じであるため、HTTP などの通信プロトコルは UTF-8 で最適に動作する傾向があり、こうしたプロトコルのほとんどは ASCII 時代に設計されたものです。一方、UTF-16は、最も優れた 平均 は、すべての生きた言語を表現した場合の空間/処理性能です。

ユニコード規格では、32ビットで表現できるコードポイント数よりも少ないコードポイントを定義しています。したがって、UTF-32 ではマルチユニット文字を扱う必要がほとんどないため、実用上は UTF-32 と UCS4 は同じエンコーディングになりました。

詳細が明らかになれば幸いです。