UTF-8

UTF-8は1〜6バイト可変長のエンコーディングスキームです。ASCIIは1文字、ラテン文字は2文字、そしてひらがな・漢字は3文字で表現する仕様になっています。

UCS-4範囲代表的な割当文字バイト数
0x00-0x7fASCII1
0x80-0x7ffラテン・ギリシャなど2
0x800-0xffff漢字・ハングルなど3
0x10000-0x1fffffゴシック・追加漢字(一部)4
0x200000-0x7fffffff(なし)5

ビットパターン

U+00000000〜U+0000007fのASCII部分は下位1バイトをそのまま使用しASCIIとしています。この使用により、Unicode策定以前の英欧の主要なドキュメントはそのままUTF-8に移行されるというメリットがあります。U+00000080〜U+000007ffは

先にも書きましたが、USC-4では各オクテットをそれぞれ「群」、次の8ビットを「面」、その次の8ビットを「区」、最後の8ビットを「点」と呼びます。群はMSBをオフにするため128のコードポイント、そして面・区・点には256のコードポイントがあります。このうち、0群0面をBMPと呼びます。UCS-2の範囲はUCS-4でも同じですから、UCS-2は0群0面の区点と考えることができます。つまり、UCS-4でU+0000XXYYと表現できる文字ははUCS-2ではU+XXYYとして考えることができるわけです。

ところで、UCS-2では256×256=65536のコードポイントがありますが実際には65536すべてに文字を割り当てているわけではありません。これらのうち、U+D800〜U+DBFFまでの1024とU+DC00〜U+DFFFまでの1024は、それぞれサロゲート領域1/サロゲート領域2として予約されています。

UTF-16

UTF-16は1文字を2バイト単位の固まり1または2個で構成します。USC-2に収容される文字についてはそのままのコードがUTF-16でも適用されますので2バイトで1文字を表現します。

UCS-2に収まらなかった文字をUTF-16でどのように表現するのかというと、2バイトの固まりを2つ並べて4バイトで1文字を構成して表現します。最初の2バイトの固まりにはサロゲート領域1を、次の2バイトの固まりにはサロゲート領域2を使い4バイトで1文字を構成するわけです。

UTF-16

UTF-16ではサロゲート領域を利用することで、1024×1024でUCS-4の0群16面までを表現することが可能になります。