ホーム第1章: 情報を数える・伝える
第1章 3節

文字の表現:ASCIIからUnicodeへ

数値しか扱えないコンピュータが、どうやって「あ」や「A」といった文字を表示・記録しているのでしょうか。文字に「背番号」を割り当てる文字コードの誕生から、世界共通の規格Unicode、そしてそれを賢く転送する「UTF-8」の仕組みまでを解き明かします。

1. 文字コード = 文字の背番号

コンピュータで文字を扱う仕組みは単純です。「どの数値が、どの文字に対応するか」という対応表(文字コード)をあらかじめ決めておくのです。

例えば、コンピュータの中に 65 という数値(2進数なら 01000001)が入っていたら、画面に文字を表示するプログラムが対応表を参照し、65A として画面に描画します。

2. 初期の標準規格「ASCII(アスキー)」

1963年、アメリカで制定された文字コード規格がASCII(American Standard Code for Information Interchange)です。

ASCIIは、アルファベットの大文字・小文字、数字、基本的な記号、および改行などの制御信号を「7ビット(128通り)」で割り当てました。

  • 65 (16進数 0x41) = A
  • 97 (16進数 0x61) = a
  • 48 (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バイトまで変化させる「可変長」方式を採用しています。

英字 'A' (1バイトで表現) 0 1000001 ← 先頭が「0」なら1バイト文字 日本語 'あ' (3バイトで表現) 1110 0011 10 000001 10 000010 ← 先頭のビットパターンでバイト数を自己申告
図 1-4:UTF-8における英字と日本語(ひらがな)のデータ構造の違い

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標準規格。