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スカラ値 | 文字 | 説明 | 桁数 |
---|---|---|---|
U+0041 | A | ラテン文字 | 基本多言語面 16進数 4桁 |
U+0061 | a | ラテン文字 | |
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 はもともと全部の文字を2バイトで表現できると思っていたときの方式です。Unicodeスカラ値の16進数4桁(2バイト)をそのまま使っていました。
しかし、これでは不足だと分かってから、まだ文字を登録していなかった 0xD800〜0xDFFF の2048文字分の領域に直接文字を割り付けずに、前半の0xD800〜0xDBFFから1文字分、後半0xDC00〜0xDFFFから1文字分のコードを組み合わせて2文字分つまり4バイトで1文字ということにしました。これにより2048文字分だった範囲を使って 1024×1024=1 048 576 文字分を生み出したことになります。
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は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バイト) |