25
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UTF-8ってそもそもどういう仕組み?

Last updated at Posted at 2019-04-11

用語について

符号化文字集合

ある文字に対してある数字やコードが当てられたリストのようなもの。例)ユニコード

文字符号化方式

ビット列と符号化文字集合とを橋渡しをするもの。例)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進数に変換して文字の区切れを見つけ、有効ビットを抽出する必要があります。

25
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
25
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?