- UTF-8は数百万の文字を表現しながら、ASCIIとの下位互換性を維持する可変長エンコーディング方式
- ASCIIと同じ7ビット領域(
U+0000〜U+007F)は1バイトのまま使うため、ASCIIファイルはそのまま有効なUTF-8ファイルになる
- それ以外の文字は2〜4バイト列で表現され、先頭バイトのビットパターンが長さを定義し、後続バイトは
10で始まることで継続バイトであることを区別する
- この設計のおかげで、UTF-8は汎用的な文字集合を扱いながらも既存のASCIIシステムと完全に互換し、最も広く使われる文字エンコーディングになった
- UTF-16、UTF-32のような他のUnicodeエンコーディングは、このようなASCII互換性を提供しない
UTF-8設計の卓越性
- UTF-8エンコーディングに初めて触れたとき、異なる言語や文字の数百万種類の文字をひとつの体系で包含しながら、既存のASCIIと互換性のある構造を持っていることに強い印象を受けた
- 基本的にUTF-8は最大32ビットを活用するが、ASCIIは7ビットしか使わない
- UTF-8の設計原則は次のとおり
- すべてのASCIIエンコード済みファイルは有効なUTF-8ファイルである
- ASCII文字だけを含むすべてのUTF-8ファイルは有効なASCIIファイルである
- わずか128文字に限られた旧来のシステムと、数百万文字を包含する体系を結びつける発想は非常に革新的
UTF-8の基本概念
- UTF-8はUnicode文字集合のすべての文字を表現することを目的に設計された可変長文字エンコーディング(variable-width encoding)
- 各文字を1〜4バイトでエンコードする
- 最初の128文字(
U+0000〜U+007F)は単一バイトで保存されるため、ASCIIとの下位互換性を確保できる
- それ以外の文字は2バイト、3バイト、4バイトでエンコードされる
- 最初のバイトの先行ビットが、エンコードに必要な全バイト数を決定する
| 1バイトパターン |
バイト数 |
全バイト列パターン |
| 0xxxxxxx |
1 |
0xxxxxxx(通常のASCII) |
| 110xxxxx |
2 |
110xxxxx 10xxxxxx |
| 1110xxxx |
3 |
1110xxxx 10xxxxxx 10xxxxxx |
| 11110xxx |
4 |
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
- マルチバイト列の2、3、4バイト目は常に**
10で始まり、これは継続バイトであることを明確に示す**
- 主バイトと継続バイトの残りのビットを組み合わせて、ひとつのコードポイントを作る
- コードポイントは固有のUnicode文字識別子で、"U+"接頭辞と16進数で表される
- 例: "A"のコードポイントは
U+0041
- UTF-8エンコーディングのバイト列から文字を解釈する流れは次のとおり
- 1. バイトを読み、先頭が0なら単一バイト文字(ASCII)と見なし、残りの7ビットで文字を表して次のバイトへ進む
- 2. 0でなければ
- 110なら2バイト文字として次の1バイトを追加で読む
- 1110なら3バイト文字として次の2バイトを読む
- 11110なら4バイト文字として追加の3バイトを読む
- 3. 決定したバイト列から先頭ビットを除いた残りのビットを結合し、コードポイントの2進値として使う
- 4. Unicode文字集合からコードポイントを探して画面に表示する
- 5. 次のバイトで繰り返す
例: ヒンディー語の文字 "अ"
- UTF-8表現:
11100000 10100100 10000101(3バイト)
- 先頭バイト(
11100000)→ 3バイト文字であることを示す
- 3バイトの有効ビットの組み合わせ →
00001001 00000101 = 16進数 0x0905
- コードポイント
U+0905はデーヴァナーガリー文字 "अ" を意味する
ファイル例
-
1. Hey👋 Buddy
- 合計13バイトで構成
- ASCII文字(H, e, y, B, u, d, d, y, 空白)→ 各1バイト
- 👋(U+1F44B)→ 4バイト
11110000 10011111 10010001 10001011
- このファイルは有効なUTF-8ファイルだが、非ASCII文字(絵文字)を含むため、ASCIIとの下位互換ではない
-
2. Hey Buddy
- 合計9バイトで、すべてASCII範囲
- したがってこのファイルは同時に有効なASCIIファイルであり、有効なUTF-8ファイルでもある
他のエンコーディングとの比較
- ASCIIとの互換性を提供するエンコーディングはいくつかあるが、UTF-8ほど広く使われてはいない
- GB18030(中国標準)などもASCII互換性を提供するが、広く使われてはいない
- ISO/IEC 8859系は単一バイト拡張(最大256文字)であるため限界がある
- UTF-16/UTF-32にはASCII互換性がない
- 'A'(U+0041): UTF-16は
00 41、UTF-32は00 00 00 41
おまけ: UTF-8 Playground
まだコメントはありません。