合同会社小村ソフト
第 2 章

ASCII から Unicode へ — 文字に番号を振る

文字に番号を振る第 1 段階の歴史をたどる。ASCII の 128 文字、日本語文字集合の乱立、そして世界中の文字に一意の番号 U+XXXX を振る Unicode まで。

すべての文字コードの祖先 — ASCII の 128 文字

「文字に番号を振る」という発想の原点は、1960 年代のアメリカで生まれた ASCII(American Standard Code for Information Interchange)です。ASCII は 7 ビット、つまり 0〜127 の 128 個の番号に、英大文字・英小文字・数字・記号、そして改行などの制御文字を割り当てました。

「A」 = 0x41(65)
大文字は 0x41 から順に並ぶ。B = 0x42、C = 0x43 …
「a」 = 0x61(97)
小文字は大文字のちょうど 0x20(32)後ろ。ビット 1 つの違いで大小変換できる設計
「0」 = 0x30(48)
数字の文字「0」と数値の 0 は別物。この区別も文字コード理解の第一歩

英語圏だけならこれで十分でした。しかし世界には、128 個ではとても収まらない数の文字があります。ここから「番号の振り方」をめぐる長い混乱が始まります。

小問 2-1 — ASCII を数字で読む

すべての文字コードの土台になっている ASCII を、実際に数字で読んでみます。

Q1. ASCII の説明として正しいものはどれですか。

Q2. ASCII で「A」の番号は 16 進で 0x41 です。これは 10 進でいくつですか。(16 進の 1 桁目は 16 の重み: 0x41 = 4 × 16 + 1)

Q3. ASCII には日本語が 1 文字もありません。その後の展開として正しいものはどれですか。

日本語の乱立時代 — 同じ文書がバイト列では別物

日本では、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 進数)と表記します。

「A」 = U+0041
ASCII の番号がそのまま Unicode の先頭に埋め込まれている(互換性への布石)
「あ」 = U+3042
16 進の 3042 = 10 進の 12354。ひらがなは U+3041 から並ぶ
「😀」 = U+1F600
絵文字も番号を持つ。4 桁を超える大きな番号は第 5 章で効いてくる

U+ の後ろの 16 進数は、慣れれば普通の数として読めます。16 進 1 桁は 0〜15、桁の重みは 1・16・256・4096。0x3042 = 3 × 4096 + 4 × 16 + 2 = 12354 — この読み替えだけ、小問で一度手を動かしておきましょう。

文字「あ」が Unicode でコードポイント U+3042 になり、UTF-8 では E3 81 82、UTF-16 では 30 42 のバイト列になる 2 段階の図

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 の基本的な発想として正しいものはどれですか。

Q5. 「あ」のコードポイントは U+3042 です。U+ の後ろは 16 進表記です。0x3042 は 10 進でいくつですか。(3 × 4096 + 0 × 256 + 4 × 16 + 2)

Q6. 「U+3042」という表記が指しているものはどれですか。

この章で持ち帰ること

  • 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 になるまでを、自分の手で計算します。