文字の表現:ASCIIからUnicodeへ
数値しか扱えないコンピュータが、どうやって「あ」や「A」といった文字を表示・記録しているのでしょうか。文字に「背番号」を割り当てる文字コードの誕生から、世界共通の規格Unicode、そしてそれを賢く転送する「UTF-8」の仕組みまでを解き明かします。
1. 文字コード = 文字の背番号
コンピュータで文字を扱う仕組みは単純です。「どの数値が、どの文字に対応するか」という対応表(文字コード)をあらかじめ決めておくのです。
例えば、コンピュータの中に 65 という数値(2進数なら 01000001)が入っていたら、画面に文字を表示するプログラムが対応表を参照し、65 = A として画面に描画します。
2. 初期の標準規格「ASCII(アスキー)」
1963年、アメリカで制定された文字コード規格がASCII(American Standard Code for Information Interchange)です。
ASCIIは、アルファベットの大文字・小文字、数字、基本的な記号、および改行などの制御信号を「7ビット(128通り)」で割り当てました。
65(16進数0x41) =A97(16進数0x61) =a48(16進数0x30) =0
当時は1バイト(8ビット)のうち1ビットをエラー検知用の「パリティビット」に割いていたため、実質7ビットで通信していました。英語圏にとっては128通りで十分だったのです。
3. 多言語化と「文字化け」のカオス
コンピュータが世界に普及するにつれ、英語以外の言語(日本語、中国語、アラビア語など)を表現する必要が出てきました。 しかし、英語と違って日本語の漢字や平仮名は数千〜数万種類あります。到底7ビット(128通り)や、8ビット(256通り)では収まりません。
そこで各国が「2バイト(16ビット = 65,536通り)」を使って、独自に文字コード(日本なら Shift-JIS や EUC-JP)を作りました。
これが悲劇を生みます。同じ 16進数の 0x82A0 というデータであっても、Shift-JISというルールで解釈すると「あ」になりますが、別の国の文字コードで解釈すると、全く異なるロシア語の文字や、あるいは意味不明な記号(俗に言う文字化け)になってしまいます。
4. 救世主「Unicode(ユニコード)」と「UTF-8」
このカオスを解決するため、「世界中のすべての文字に、重複しない唯一無二の背番号を割り当てよう」という壮大なプロジェクトが立ち上がりました。これが現代の標準規格であるUnicodeです。
Unicodeにより、「あ」は世界共通で U+3042(16進数)という背番号(コードポイント)を割り当てられました。これで文字化けの根本的な原因は排除されました。
データをどう表現するか:UTF-8の賢い可変長設計
Unicodeで番号を決めた後、それを実際のバイト列としてどう記録するかが問題になります。 すべての文字を3〜4バイト固定で記録すると、英語のテキストはデータ量が3〜4倍に膨れ上がり、通信帯域やストレージを無駄に圧迫します。
そこで発明されたのが「UTF-8」という符号化方式です。UTF-8は、文字によってデータの長さを1バイトから4バイトまで変化させる「可変長」方式を採用しています。
UTF-8は、各バイトの先頭にあるビットを見るだけで「この文字が何バイトで構成されているか」を瞬時に判別できる設計になっています:
- 先頭が
0= 1バイトのデータ(ASCII互換) - 先頭が
1110= 3バイト文字の第1バイト(日本語の多くはこれに該当) - 先頭が
10= 複数バイト文字の第2バイト以降
この可変長方式のおかげで、英語圏のデータ量は従来のまま維持しつつ、世界中の多様な文字や絵文字まで、文字化けなく1つのシステムで共存・伝送できるようになりました。現代のWebサイトの9割以上がUTF-8で記述されています。
コンピュータの文字表現で中心となる各規格の特徴を整理しておきましょう。
- ASCII(アスキー):
- データ長:7ビット(実質1バイト)
- 特徴:英数字と基本的な記号のみ。すべての現代的な文字コードのベース。
- Shift_JIS(シフトJIS):
- データ長:日本語文字を2バイトで表現
- 特徴:かつて国内のOSやPC環境で広く普及。多言語混在環境で文字化けの原因になりやすい。
- Unicode(ユニコード):
- 役割:世界中のすべての文字に固有の識別番号(コードポイント)を割り当てる「共通の背番号表」。
- UTF-8(ユーティーエフエイト):
- データ長:1〜4バイトの可変長
- 特徴:Unicodeの番号を実際のデータに落とし込む符号化方式。ASCIIと互換性があり、現代のWeb標準規格。