Unicodeの「あ(U+3042)」をUTF-8で表すと「e3 81 82」になる理由

Unicodeの「あ(U+3042)」をUTF-8で表すと「0xe3 0x81 0x82(e3 81 82)」になります。

この記事ではUnicodeからUTF-8にエンコードする方法を詳しく説明します。

「あ(U+3042)」をUTF-8で表すと「0xe3 0x81 0x82(e3 81 82)」になる理由

UnicodeからUTF-8にエンコードする方法について説明します。以下のエンコード手順に沿って、エンコードを行うと、Unicodeの「あ(U+3042)」がUTF-8では「0xe3 0x81 0x82(e3 81 82)」になる理由が分かります。

エンコード手順

  • 16進数を2進数に変換する
  • UTF-8にエンコードする際のルールに適用する
  • 2進数を16進数に戻す

各手順について順番に説明します。

step
1
16進数を2進数に変換する

まず、あ(U+3042)を2進数に変換します。U+3042は16進数なので2進数に変換すると0011 0000 0100 0010となります。

3    0    4    2
↓ 2進数に変換
0011 0000 0100 0010

step
2
UTF-8にエンコードする際のルールに適用する

UnicodeからUTF-8にエンコードする際のルールは以下のようになっています。

Unicodeの文字範囲UTF-8のビットパターン
U+0000~U+007F
(1バイト文字)
0xxxxxxx
(00~7F)
U+0080~U+07FF
(2バイト文字)
110xxxxx 10xxxxxx
(C2〜DF) (80〜BF)
U+0800~U+FFFF
(3バイト文字)
1110xxxx 10xxxxxx 10xxxxxx
(E0〜EF) (80〜BF) (80〜BF)
U+10000~U+10FFFF
(4バイト文字)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
(F0〜F4) (80〜BF) (80〜BF) (80〜BF)

3バイト文字をUTF-8にエンコードする際、UTF-8のビットパターンは1110xxxx 10xxxxxx 10xxxxxxになります。この場合、最初のバイトはE0EFまで、2番目のバイトは80BFまで、3番目のバイトは80BFまでの値を取り得ます。

あ(U+3042)は3バイト文字の範囲に入るため、3バイトでエンコードされます。具体的な変換プロセスを以下に示します。

具体的な変換プロセス

  1. 最初のバイト
    • 3バイト文字の場合、最初のバイトは1110xxxxの形式を取ります。
    • U+3042の上位4ビット(0011)をxxxxに置き換えます。結果は11100011になります。
  2. 次のバイト
    • 次のバイトは10xxxxxxの形式を取ります。
    • U+3042の次の6ビット(000001)をxxxxxxに置き換えます。結果は10000001になります。
  3. 最後のバイト
    • 最後のバイトも10xxxxxxの形式を取ります。
    • U+3042の最後の6ビット(000010)をxxxxxxに置き換えます。結果は10000010になります。
1110xxxx 10xxxxxx 10xxxxxx
↓
11100011 10000001 10000010

step
2
2進数を16進数に戻す

先ほど変換した2進数を16進数に戻すと以下のようになります。

11100011 10000001 10000010
↓
1110 0011 1000 0001 1000 0010
↓ 16進数に変換
e    3    8    1    8    2
↓
e3 81 82

この手順に従って、エンコードを行うと、Unicodeの「あ(U+3042)」がUTF-8では「0xe3 0x81 0x82(e3 81 82)」になることが分かります。

補足

UTF-8では先頭のバイトが文字の長さを示しています(1バイト目の先頭ビットの数で何バイト文字かが分かる)。また、その後に続くバイトが10で始まることで、それが続きのバイトであることを示しています。そのため、上表に示すようなビットパターンになっています。

本記事のまとめ

この記事ではUnicodeからUTF-8にエンコードする方法について説明しました。

お読み頂きありがとうございました。