はじめに
文字コード関連の解説を読んでいてると、よく分からない用語(符号化``文字集合など)と細かい数字の羅列(E9``AC``B1など)が出てきて、頭がごちゃごちゃになってしまいます。
この記事では、なるべく細かくなりすぎずに、UnicodeとUTF-8の違いを理解することを目的としています。
Unicodeとは
Unicodeとは、符号化文字集合の一種となります。符号化文字集合は、__「文字」に「数値」を割り当てたものの集まり__のことを言います。以下のように表すことができます。
「[Unicode一覧 0000-0FFF](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_0000-0FFF)」 (2018年7月1日 (日) 02:58 UTC) 『ウィキペディア日本語版』
表の「左にある数値」と「上にある数値」を組み合わせて、一つの文字を対応付けさせています。
例えば、アルファベットの"A"は、以下のように対応付けさせることができます。
`U+0041` は、`コードポイント`と呼ばれています。`コードポイント`は__文字の住所__というイメージになるでしょうか。
UTF-8とは
UTF-8は、文字符号化方式の一種となります。
文字符号化方式とは、コードポイントを__「何バイトで」「どのように表現するか」を決めている方式__です。
UTF-8は、__Unicodeのコードポイント__を表す方式です。
UTF-8の場合は、最初の128文字は1バイトでコードポイントを表現しています。その後の文字は、2〜4バイトで表現しています。
まとめると以下のようになります。
| コードポイント | 数値表現 | 何バイトで | どのように表現するか |
|---|---|---|---|
| U+0000〜U+007F | 0xxxxxxx | 1バイト(8ビット) | "0"始まり |
| U+0080〜U+07FF | 110xxxxx 10xxxxxx | 2バイト(16ビット) | 1バイト目は"110"始まり 2バイト目は"10"始まり |
| U+0800〜U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3バイト(24ビット) | 1バイト目は"1110"始まり 2バイト目以降は"10"始まり |
| U+10000〜U+10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx | 4バイト(32ビット) | 1バイト目は"11110"始まり 2バイト目以降は"10"始まり |
コードポイントの範囲ごとに使用しているバイト数が違ってきています。また、各バイトの最初の桁の数値が固定されています("0"始まりなど)。
このような取り決めをしているのが、文字符号化方式なのですね。
UTF-16やUTF-32についても
UTF-8以外に、UTF-16やUTF-32もあります。これらもUnicodeのコードポイントを表す方式です。
それぞれ「何バイトで」の違いと「具体的な表現」をまとめると以下のようになります。
| 方式 | 何バイトで | 文字"A"の表現 |
|---|---|---|
| UTF-8 | 1〜4バイト | 41 |
| UTF-16 | 2バイト、または4バイト | 00 41 |
| UTF-32 | 4バイト固定 | 00 00 00 41 |
同じUnicodeのコードポイントでも、表現する方法が違っているわけですね。
「どのように表現するのか」については、話が難しくなりそうなので、この記事では取り扱いません。
まとめ
-
Unicodeは、「文字」に「数値」を割り当てたものの集まり(文字符号化集合)- 割り当てた「数値」は
コードポイントと呼ばれる
- 割り当てた「数値」は
-
UTF-8は__Unicodeのコードポイントを「何バイトで」「どのように表現するか」__を決めている方式(文字符号化方式)- UTF-16やUTF-32も同様
以上の流れで解説させていただきました。
UnicodeとUTF-8の関係を雰囲気で捉えることができれば、詳細な話があったとしても「今どの部分の話なのか」を念頭に置いておくことができるので、頭の混乱を避けられます。
また、他の文字コードについても似たような関係があるので、他の文字コードを勉強するときにも理解の助けになるのではないでしょうか。
