メインコンテンツまでスキップ

3. UTF-8 definition (UTF-8定義)

UTF-8は、Unicode標準 [UNICODE] によって定義されています。説明と公式は、ISO/IEC 10646-1 [ISO.10646] の附属書Dにも記載されています。

エンコーディング範囲 (Encoding Range)

UTF-8では、U+0000..U+10FFFF範囲(UTF-16アクセス可能範囲)の文字が、1から4オクテットのシーケンスを使用してエンコードされます。

単一オクテットシーケンス

1つの「シーケンス」の唯一のオクテットは、上位ビットが0に設定され、残りの7ビットが文字番号のエンコードに使用されます。

マルチオクテットシーケンス

nオクテットのシーケンス(n>1)では:

  • 最初のオクテットは、上位n個のビットが1に設定され、その後に0に設定されたビットが続きます
  • そのオクテットの残りのビットには、エンコードされる文字の番号からのビットが含まれます
  • 後続のオクテットは、すべて上位ビットが1に設定され、次のビットが0に設定されており、それぞれに6ビットが残され、エンコードされる文字からのビットが含まれます

エンコーディングテーブル (Encoding Table)

以下の表は、これらの異なるオクテットタイプの形式をまとめたものです。文字xは、文字番号のビットをエンコードするために使用可能なビットを示します。

文字番号範囲        |        UTF-8オクテットシーケンス
(16進数) | (2進数)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

エンコーディングアルゴリズム (Encoding Algorithm)

文字をUTF-8にエンコードする手順は以下のとおりです:

ステップ1: オクテット数の決定

文字番号と上記の表の最初の列から、必要なオクテット数を決定します。表の行は相互に排他的であることに注意することが重要です。つまり、指定された文字をエンコードする有効な方法は1つだけです。

ステップ2: 上位ビットの準備

表の2番目の列に従って、オクテットの上位ビットを準備します。

ステップ3: 文字ビットの充填

文字番号のビットから、2進数で表現された、xでマークされたビットを充填します。文字番号の最下位ビットをシーケンスの最後のオクテットの最下位位置に置き、次に文字番号の次の上位ビットをそのオクテットの次の上位位置に置く、というように続けます。最後のオクテットのxビットが充填されたら、最後から2番目のオクテットに移動し、その前のオクテットに移動する、というように、すべてのxビットが充填されるまで続けます。

予約文字範囲 (Reserved Character Ranges)

UTF-8の定義では、U+D800からU+DFFFまでの文字番号のエンコードが禁止されています。これらは、UTF-16エンコーディング形式(サロゲートペアとして)で使用するために予約されており、文字を直接表現しません。

UTF-16からの変換

UTF-16データからUTF-8にエンコードする場合、最初にUTF-16データをデコードして文字番号を取得し、次に上記のようにUTF-8でエンコードする必要があります。

CESU-8との比較

これは、インターネットでの使用を意図していないUTF-8に似たエンコーディングであるCESU-8 [CESU-8] とは対照的です。CESU-8は、UTF-8と同様に動作しますが、文字番号(コードポイント)の代わりにUTF-16コード値(16ビット量)をエンコードします。これにより、0xFFFFを超える文字番号については異なる結果になります。これらの文字のCESU-8エンコーディングは、有効なUTF-8ではありません。

デコーディングアルゴリズム (Decoding Algorithm)

UTF-8文字のデコードは以下の手順で進行します:

ステップ1: 2進数の初期化

すべてのビットを0に設定した2進数を初期化します。最大21ビットが必要になる場合があります。

ステップ2: 文字ビットの決定

シーケンス内のオクテット数と上記の表の2番目の列から、文字番号をエンコードするビット(xでマークされたビット)を決定します。

ステップ3: ビットの分配

シーケンスからのビットを2進数に分配します。最初にシーケンスの最後のオクテットからの下位ビット、左に進み、xビットがなくなるまで続けます。2進数は文字番号と等しくなります。

セキュリティ要件 (Security Requirement)

上記のデコーディングアルゴリズムの実装は、無効なシーケンスのデコードから保護しなければなりません (MUST)。

無効なシーケンスの例

例えば、単純な実装では以下のようなことが起こる可能性があります:

  • 過長UTF-8シーケンスC0 80を文字U+0000にデコードする
  • サロゲートペアED A1 8C ED BE B4をU+233B4にデコードする

無効なシーケンスのデコードは、セキュリティ上の影響をもたらしたり、その他の問題を引き起こす可能性があります。以下のセキュリティに関する考慮事項(セクション10)を参照してください。


関連リンク