Unicode コードポイントと2進数エンコーディング

Unicode コードポイントが UTF-8 と UTF-16 でどのように2進数にエンコードされるか解説。マルチバイトシーケンス、サロゲートペア、BMP と他のプレーンも学べます。

Unicode CharactersBinary (UTF-8/UTF-16)Encoding

詳細な説明

Unicode は、すべての文字体系のすべての文字に一意のコードポイント('A' の U+0041 のような数値)を割り当てています。課題は、これらのコードポイントを効率的にバイナリのバイトにエンコードすることです。UTF-8 と UTF-16 が2つの主要なエンコーディング方式です。

UTF-8 のエンコーディングルール:

UTF-8 は1バイトから4バイトの可変長エンコーディングを使います:

コードポイント範囲 バイト1 バイト2 バイト3 バイト4
U+0000 から U+007F 0xxxxxxx -- -- --
U+0080 から U+07FF 110xxxxx 10xxxxxx -- --
U+0800 から U+FFFF 1110xxxx 10xxxxxx 10xxxxxx --
U+10000 から U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

例 --- ユーロ記号 (€)(U+20AC) を UTF-8 でエンコード:

  1. U+20AC = 0010 0000 1010 1100(2進数で16ビット)
  2. 3バイト範囲(U+0800 から U+FFFF)に該当
  3. ビットをテンプレートに分配: 1110 0010 | 10 000010 | 10 101100
  4. 結果: 16進数で E2 82 AC(3バイト)

UTF-8 が支配的な理由:

UTF-8 は ASCII と後方互換性があり、すべての ASCII 文字は同じ値の1バイトで表現されます。つまり、既存の ASCII テキストは自動的に有効な UTF-8 です。英語テキストの場合、UTF-8 は空間効率が良く(1文字1バイト)、かつすべての Unicode 文字をサポートします。Web ページの98%以上が UTF-8 エンコーディングを使用しています。

UTF-16 とサロゲートペア:

UTF-16 は基本多言語面(U+0000 から U+FFFF)の文字には2バイトを使い、絵文字などの補助文字には4バイト(サロゲートペア)を使います。JavaScript の文字列は内部的に UTF-16 であるため、U+1F600 のような絵文字は単一の文字として表示されるにもかかわらず、JavaScript では .length が 2 になります。

ユースケース

国際化エンジニアは、データがシステム境界を越える際に文字化けを引き起こす文字エンコーディングの問題をデバッグするために、UTF-8 バイトシーケンスを分析します。

Try It — Number Base Converter

フルツールを開く