Unicode

はじめは16ビット→いろいろあって21ビット

16ビット(2バイト)あれば 216=65536 文字を登録できます。漢字を知っている人ならすぐに足りないと感じますが、最初はこれで全世界の文字を登録できると思っていた様です。

当然不足して、32ビット(4バイト)にする案もあったのですが、いろいろあって結局 21ビット(3バイトより少ない)に落ち着きました。しかも 0~10FFFF です。

この中途半端なビット数のために、文字セットの表現もエンコード方式の表現もちょっとくせがあります。

文字セットの表現

文字セットは16進数にU+をつけて U+0000~U+10FFFF で表します。これをUnicodeスカラ値といいます。

16ビット(2バイト)で表現できる部分は16進数で4桁で表現します。 U+0000~U+FFFF です。ここには基本的な文字を登録してあり、基本多言語面(BMP)と呼ばれます(この他はあまり使われない漢字がほとんどを占めます)。

これで表現できない部分は U+10000~U+10FFFF までです。16進数で必要な桁数を使って表現します。

Unicodeに登録されたいろいろな文字の例
Unicodeスカラ値文字説明桁数
U+0041Aラテン文字基本多言語面
16進数 4桁
U+0061aラテン文字
U+00E8èラテン文字
U+042FЯキリル文字(ロシア)
U+05D0אヘブライ文字
U+0905デーヴァナーガリ文字
U+0E04タイ文字
U+2162ローマ数字
U+3042ひらがな
U+4E9C漢字(あ)
U+D558ハングル
U+103A0𐎠楔形文字追加面(16面あり)
16進数 5桁〜6桁
U+2000B𠀋漢字(じょう)
U+20BB7𠮷漢字(よし)
U+29E3D𩸽漢字(ほっけ)

エンコード

JISで面区点で示された文字を実際に使うときに、2022(JIS),Shift_JIS,EUC-JPなどさまざまなエンコーディングを使用したのと同様に、Unicodeにもたくさんの方式があります。主に使われているのは UTF-8 と UTF-16 の2つです。

UTF-16

UTF-16 はもともと全部の文字を2バイトで表現できると思っていたときの方式です。Unicodeスカラ値の16進数4桁(2バイト)をそのまま使っていました。

しかし、これでは不足だと分かってから、まだ文字を登録していなかった 0xD800〜0xDFFF の2048文字分の領域に直接文字を割り付けずに、前半の0xD800〜0xDBFFから1文字分、後半0xDC00〜0xDFFFから1文字分のコードを組み合わせて2文字分つまり4バイトで1文字ということにしました。これにより2048文字分だった範囲を使って 1024×1024=1 048 576 文字分を生み出したことになります。

UTF-8 と UTF-16
Unicodeスカラ値 文字 説明 UTF-8 UTF-16
U+0041 A ラテン文字 41 0041
U+0061 a ラテン文字 61 0061
U+00E8 è ラテン文字 C3 A8 00E8
U+042F Я キリル文字(ロシア) D0 AF 042F
U+05D0 א ヘブライ文字 D7 90 05D0
U+0905 デーヴァナーガリ文字 E0 A4 85 0905
U+0E04 タイ文字 E0 B8 84 0E04
U+2162 ローマ数字 E2 85 A2 2162
U+3042 ひらがな E3 81 82 3042
U+4E9C 漢字(あ) E4 BA 9C 4E9C
U+D558 ハングル ED 95 98 D558
U+103A0 𐎠 楔形文字 F0 90 8E A0 D800 DFA0
U+2000B 𠀋 漢字(じょう) F0 A0 80 8B D840 DC0B
U+20BB7 𠮷 漢字(よし) F0 A0 AE B7 D842 DFB7
U+29E3D 𩸽 漢字(ほっけ) F0 A9 B8 BD D867 DE3D

UTF-8

UTF-8は1~4バイト(初期の定義では6バイトまであった)の可変長コードです。

それぞれの1バイトの値で、それが文字の最初のバイトであるか、2バイト目以降のバイトであるかがわかるようになっています。

コード カテゴリ 備考
00-7x 1バイト文字 US-ASCIIにおなじ
8x,9x,Ax,Bx 多バイト文字の2バイト目以降
Cx,Dx 2バイト文字の開始バイト
Ex 3バイト文字の開始バイト 漢字はおおむねこれで開始
Fx 4バイト以上の文字の開始バイト F0-F7は4バイト、(F8-FBは5バイト、FC-FDは6バイト)
聖愛中学高等学校
http://www.seiai.ed.jp/
Jun. 2011