Unicode コードポイントと2進数エンコーディング
Unicode コードポイントが UTF-8 と UTF-16 でどのように2進数にエンコードされるか解説。マルチバイトシーケンス、サロゲートペア、BMP と他のプレーンも学べます。
詳細な説明
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 でエンコード:
- U+20AC =
0010 0000 1010 1100(2進数で16ビット) - 3バイト範囲(U+0800 から U+FFFF)に該当
- ビットをテンプレートに分配:
1110 0010|10 000010|10 101100 - 結果: 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 バイトシーケンスを分析します。