用語について
符号化文字集合
ある文字に対してある数字やコードが当てられたリストのようなもの。例)ユニコード
文字符号化方式
ビット列と符号化文字集合とを橋渡しをするもの。例)UTF-8、shift-jis
UTF-8の規則
1. 基本単位 1バイト = 8ビット
文字に対応するビット数(bit)は必ず8の倍数をとり、この8ビットのまとまりをバイト(byte)と呼びます。1.5バイト(12ビット)の文字などはありません。
バイト数 | ビット数 | ユニコード | 例 |
---|---|---|---|
1 | 8 | U+0000 - U+007F | 数字 アルファベット |
2 | 16 | U+0080 - U+07FF | アラビア文字 |
3 | 24 | U+0800 - U+FFFF | ひらがな 漢字 |
4 | 32 | U+10000 - U+1FFFFF | 難漢字 |
2. バイトの先頭は固定
ビット列に1バイトの文字や4バイトの文字が混在していても大丈夫なように、UTF-8ではそれぞれのバイトの先頭が決まったパターンをとることで見分けられるようにしています。
1バイトの文字
先頭を0
とする
「A」01000001
2バイトの文字
1バイト目の先頭を110
、2バイト目の先頭を10
とする
「д」11000110
10110010
3バイトの文字
1バイト目の先頭を1110
、2バイト目と3バイト目の先頭を10
とする
「あ」11100011
10000001
10000010
文字の始まりを探そうと思えば、先頭が10
でないバイトを探せばよいということになります。
3. 有効ビット
固定の数字を除いた部分は有効ビットと呼ばれ、文字を特定する役割があります。
例えば、UTF-8でエンコードした「あ」は
11100011
10000001
10000010
これから先頭のビットパターンを除くと
0011
000001
000010
これが有効ビットです。
これをつなげて16進数にすると、そのままユニコードの符号位置(U+○○○○)となります。
UTF-8の例
UTF-8でエンコードした「オロナミンC」は16進数で
E382AAE383ADE3838AE3839FE383B343
2進数で
11100011100000101010101011100011100000111010110111100011100000111000101011100011100000111001111111100011100000111011001101000011
です。
これをデコードしてみましょう。
8ビット毎に区切っていくと、先頭のビットパターンの規則により、文字の区切れがわかります。最初の文字を表す二進数は111000111000001010101010
だとわかります。
ここから有効ビットの部分を取り出すと、0011000010101010
です。
そして16進数に戻すと、30AA
となり、これは「オ」のユニコード U+30AA に対応しています。
まとめ
UTF-8でエンコードしたビット列は16進数で表記されることが多いですが、それはそのままユニコードの符号位置には対応していません。
そこから文字を読み取るには、2進数に変換して文字の区切れを見つけ、有効ビットを抽出する必要があります。