この記事を記録しておこうと思った背景
文字コードあたりを調べたときによく出てくる用語、何回も調べてきた気がするが結局また調べるということを繰り返しており、この記事を見ればざっと頭の中が整理されるようにしたかったため
ざっくり時系列
| 時代 | 代表例 | 処理の流れ |
|---|---|---|
| 昔(~1990年代) | ASCII、Shift_JIS、EUC-JP | 文字 → バイト列 |
| 今(2000年代~現在) | Unicode + UTF-8(主流)、Unicode + UTF-16、Unicode + UTF-32 | 文字 → ID → バイト列 |
詳細な時系列
昔は各国が独自のルールで文字を直接0と1(バイト列)に変換し、OSやアプリがそのバイト列を保存していた
↓
しかしこれだとAという国が保存したファイルをBという国が開いたとき、保存時と閲覧時でルールが異なるから文字化けするという問題が発生
↓
これを解消するため、世界中で同じ文字を共通に扱うことになった。文字の管理(Unicode)と保存方法(UTF-8などの文字コード)を分離した。
↓
Unicodeで「世界共通の文字ID」を管理し、文字コードでそのIDをバイト列に変換してOSやアプリがそのバイト列を保存
↓
普段はエディタがそのバイト列を文字として解釈して表示するため、人間には「あ」などの文字として見える。バイト列そのものを確認したい場合は、バイナリエディタなどが基本的には16進数(例:E3 81 82)で表示する。
なぜ16進数が使われるのか
コンピュータはデータを0と1(2進数)で扱う。
例えばUTF-8の「あ」は、実際には次のような3バイトのデータとして保存される。
| 1バイト | 2進数 | 10進数 | 16進数 |
|---|---|---|---|
| 1個目 | 11100011 | 227 | E3 |
| 2個目 | 10000001 | 129 | 81 |
| 3個目 | 10000010 | 130 | 82 |
バイト列は2進数・10進数・16進数など、さまざまな表記方法で表すことができる。
しかし、
- 2進数:桁数が多く読みにくい
- 10進数:桁数は少ないが、どこまでが1バイトなのか直感的に分かりにくい
- 16進数:**2桁でちょうど1バイト(8ビット)**を表せるため、バイトの区切りが分かりやすくコンパクト
そのため、バイト列を確認するツール(バイナリエディタやデバッガなど)では、16進数で表示するのが一般的である。