ASCII から Unicode へ — 文字に番号を振る
文字に番号を振る第 1 段階の歴史をたどる。ASCII の 128 文字、日本語文字集合の乱立、そして世界中の文字に一意の番号 U+XXXX を振る Unicode まで。
すべての文字コードの祖先 — ASCII の 128 文字
「文字に番号を振る」という発想の原点は、1960 年代のアメリカで生まれた ASCII(American Standard Code for Information Interchange)です。ASCII は 7 ビット、つまり 0〜127 の 128 個の番号に、英大文字・英小文字・数字・記号、そして改行などの制御文字を割り当てました。
英語圏だけならこれで十分でした。しかし世界には、128 個ではとても収まらない数の文字があります。ここから「番号の振り方」をめぐる長い混乱が始まります。
小問 2-1 — ASCII を数字で読む
すべての文字コードの土台になっている ASCII を、実際に数字で読んでみます。
Q1. ASCII の説明として正しいものはどれですか。
ASCII は 7 ビット、つまり 0〜127 の 128 個の番号に英数字・記号・制御文字(改行など)を割り当てた規格です。256 文字ではありません — 8 ビット目の使い道は各国が拡張として奪い合うことになり、それが符号化乱立の一因になりました。日本語は含まれておらず、Unicode よりずっと古い 1960 年代の規格です。
Q2. ASCII で「A」の番号は 16 進で 0x41 です。これは 10 進でいくつですか。(16 進の 1 桁目は 16 の重み: 0x41 = 4 × 16 + 1)
0x41 = 4 × 16 + 1 = 65 です。「A = 65」は多くのプログラミング言語で顔を出す定番の値で、B = 66, C = 67 と続きます。小文字「a」は 0x61 = 97 で、大文字と 0x20(32)だけ離れている — この規則性も ASCII 設計の妙です。
Q3. ASCII には日本語が 1 文字もありません。その後の展開として正しいものはどれですか。
日本では JIS 規格として漢字を含む文字集合が定められ、それをバイト列にする方式として Shift_JIS・EUC-JP・JIS コード(ISO-2022-JP)などが並立しました。同じ日本語の文書でも作った環境によってバイト列が違う — この乱立こそが日本語の文字化け問題の温床であり、機種間のメール文字化けなどに悩まされる時代が長く続きました。
日本語の乱立時代 — 同じ文書がバイト列では別物
日本では、JIS 規格として漢字を含む文字集合(どの漢字に何番を振るか)が定められました。ところが、その番号をバイト列にする方式(符号化)が複数生まれたのです。パソコンの世界では Shift_JIS、UNIX の世界では EUC-JP、電子メールでは JIS コード(ISO-2022-JP)—— それぞれの環境で別の方式が主流になりました。
同じ「こんにちは」でも、Shift_JIS のファイルと EUC-JP のファイルではバイト列がまったく別物です。第 1 章の合言葉を思い出してください — 札のないバイト列を受け取った側は読み方を推測するしかなく、外せば化ける。符号化が乱立していた時代の日本語は、文字化けの常連だったのです。この時代の主役 Shift_JIS は今も現役なので、第 4 章で構造まで立ち入ります。
Unicode — 世界中の文字に、一意の番号を
言語ごと・環境ごとに番号表が乱立するなら、いっそ世界中の文字を 1 つの表に集めて、一意の番号を振ってしまおう — それが Unicode の発想です。ひらがなも、漢字も、アラビア文字も、絵文字も、同じ 1 つの番号空間に載っています。この番号をコードポイントと呼び、U+XXXX(XXXX は 16 進数)と表記します。
U+ の後ろの 16 進数は、慣れれば普通の数として読めます。16 進 1 桁は 0〜15、桁の重みは 1・16・256・4096。0x3042 = 3 × 4096 + 4 × 16 + 2 = 12354 — この読み替えだけ、小問で一度手を動かしておきましょう。
Unicode が決めるのは第 1 段階(番号)まで。同じ U+3042 が、第 2 段階の符号化によって別のバイト列になります。「Unicode = UTF-8」ではない、がこの図の要点です。
Unicode は「番号」まで — バイトにする仕事は残っている
ここで第 1 章の 2 段階の見方が効いてきます。Unicode が解決したのは第 1 段階(番号の振り方の統一)だけです。番号をバイト列にする第 2 段階には、依然として複数の方式 — UTF-8・UTF-16・UTF-32 — があります。どれも同じ Unicode の番号を運ぶ、異なる符号化です。
「Unicode 対応です」という言葉だけでは、ファイルのバイト列は特定できません。実務で問われるのは常に「UTF-8 なのか、UTF-16 なのか、BOM は付くのか」という第 2 段階の選択です。次章ではその代表格 UTF-8 を、実際にビットを流し込んで手で組み立てます。
小問 2-2 — Unicode とコードポイント
世界中の文字に一意の番号を振るという Unicode の発想と、U+XXXX 表記の読み方を確認します。
Q4. Unicode の基本的な発想として正しいものはどれですか。
言語ごとに番号表が乱立した反省から、Unicode は「世界中の文字を 1 つの表に集め、一意の番号を振る」道を選びました。ひらがなも漢字も絵文字も、同じ 1 つの番号空間に載っています。「2 バイト固定」は初期の見込みで、現在のコードポイントは U+10FFFF まであり 2 バイトには収まりません — この話は第 5 章のサロゲートペアにつながります。
Q5. 「あ」のコードポイントは U+3042 です。U+ の後ろは 16 進表記です。0x3042 は 10 進でいくつですか。(3 × 4096 + 0 × 256 + 4 × 16 + 2)
16 進 4 桁の重みは 4096・256・16・1 なので、3 × 4096 + 0 + 4 × 16 + 2 = 12288 + 64 + 2 = 12354 です。U+XXXX という表記は「16 進で書いた番号」にすぎず、これが読めれば Unicode の資料はぐっと身近になります。ちなみに「あ」の 2 つ隣、U+3044 は「い」です(間の U+3043 は小書きの「ぃ」)。
Q6. 「U+3042」という表記が指しているものはどれですか。
U+3042 は第 1 段階の「番号」です。保存するにはこの番号を第 2 段階の符号化でバイト列に変える必要があり、UTF-8 なら E3 81 82、UTF-16 なら 30 42 になります。番号はどの符号化を選んでも変わらない、という点が急所です。フォントは番号に「形」を与える別の仕組みで、符号化とはさらに別の層の話です。
この章で持ち帰ること
- ASCII は 7 ビット・128 文字。「A」= 0x41 = 65。多くの文字コードの土台
- 日本語は Shift_JIS・EUC-JP など符号化が乱立する時代が長く、文字化けの温床だった
- Unicode は世界中の文字に一意の番号(コードポイント、U+XXXX)を振る。「あ」= U+3042 = 12354
- Unicode が決めるのは番号まで。バイトにする第 2 段階(UTF-8 など)は別の選択として残る
次章はいよいよ第 2 段階の主役、UTF-8 です。U+3042 が E3 81 82 になるまでを、自分の手で計算します。