UTF-8
文字コード
unicode

UnicodeとUTF-8の違いを雰囲気で理解する


はじめに

文字コード関連の解説を読んでいてると、よく分からない用語(符号化文字集合など)と細かい数字の羅列(E9ACB1など)が出てきて、頭がごちゃごちゃになってしまいます。

この記事では、なるべく細かくなりすぎずに、UnicodeUTF-8の違いを理解することを目的としています。


Unicodeとは

Unicodeとは、符号化文字集合の一種となります。符号化文字集合は、「文字」に「数値」を割り当てたものの集まりのことを言います。以下のように表すことができます。


スクリーンショット 2019-05-11 23.22.40.png

Unicode一覧 0000-0FFF」 (2018年7月1日 (日) 02:58 UTC) 『ウィキペディア日本語版』


表の「左にある数値」と「上にある数値」を組み合わせて、一つの文字を対応付けさせています。

例えば、アルファベットの"A"は、以下のように対応付けさせることができます。

スクリーンショット 2019-05-11 23.09.10のコピー.png

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-8Unicodeのコードポイントを「何バイトで」「どのように表現するか」を決めている方式(文字符号化方式)


    • UTF-16やUTF-32も同様



以上の流れで解説させていただきました。

UnicodeUTF-8の関係を雰囲気で捉えることができれば、詳細な話があったとしても「今どの部分の話なのか」を念頭に置いておくことができるので、頭の混乱を避けられます。

また、他の文字コードについても似たような関係があるので、他の文字コードを勉強するときにも理解の助けになるのではないでしょうか。


参考