Unicode の UTF-8 コード化

プログラムで UTF-8 を扱う際に気づいたことなど。メモ。

Unicode とは

Unicode は、世界で使われる全ての文字を共通の符号化文字集合にて利用できるようにしようという考えで作られた文字集合である。元々16ビットの文字集合で全ての文字の網羅を目指して開発されたが、コードポイントが圧倒的に足りず、現在では21ビットの文字集合として規定されている。

Unicode の文字を表現する場合、"U+" にその文字のコードポイントを表す16進数を続けた文字列を使って表す。たとえば、"A" という文字は Unicode ではコードポイント 41 にあり、"U+0041" となる。

UTF-8 とは

実際にコンピュータで Unicode を扱う際は符号化を行う。その符号化方式の 1 つが UTF-8 である。

8 bit 単位の可変長コード(1-4 byte)にエンコードする方式。ASCII に対して上位互換となっており、文字の境界が明確であるため使いやすい。

Unicode を UTF-8 のコードに直す

UTF-8 は Unicode の U+0000 から U+1FFFFF までを、1-4 byte で表現する。

以下の表にしたがって、Unicode を UTF-8 に符号化することが出来る。

UTF-8 への符号化法
Unicode UTF-8 に変換したときのビットパターン
コードポイント ビットパターン 1 バイト目 2 バイト目 3 バイト目 4 バイト目
U+0000 - U+007F 00000000, 0xxxxxxx 0xxxxxxx
U+0080 - U+07FF 00000xxx, xxyyyyyy 110xxxxx 10yyyyyy
U+0800 - U+FFFF xxxxyyyy, yyzzzzzz 1110xxxx 10yyyyyy 10zzzzzz
U+10000 - U+1FFFFF 000wwwxx, xxxxyyyy, yyzzzzzzz 11110www 10xxxxxx 10yyyyyy 10zzzzzz
表の xxxxx や yyyyyy などは、任意の 2 進数値を表している。xxxxx は任意の 5 bit の 2 進数値、yyyyyy は任意の 6 bit の 2 進数値である。 たとえば、U+0041 "A" のように、コードポイントの U+0000 から U+007F までの文字は、下位 2 byte がそのまま UTF-8 のコードとなる。