矢沢 久雄

 コンピュータの世界には,様々な文字コード体系が存在しますが,Windowsユーザーが最低限知っておきたいものは,ASCII,JISコード,シフトJISコード,Unicode,EUCの5つでしょう。特にASCIIは,文字コードの元祖とも呼べるほど重要なものです。そのほかの大部分の文字コードは,ASCIIを基にして作られたと言っても過言ではありません。今回は,ASCIIの仕組みと特徴,および文字コードがディスプレイやプリンタに表示,印字されるしくみを説明します。

●ASCII誕生の経緯

 そもそも,なぜ文字コードなどというものが必要だったのでしょう? もちろん,コンピュータで文字を処理するためです。ただし,文字コードが必要な理由は,もう一つあります。それは,異なる機種のコンピュータで,文書データを交換するためです。

 文書データと聞くと,ワープロを想像されることでしょう。昔のワープロ専用機では,それぞれ独自の文字コードが使われていました。「OASYS」「書院」「文豪」といったメーカーの異なる日本語ワープロ専用機では,使われる文字コードがそれぞれ異なっていたのです。これでは,相互に文書データを交換できませんが,あくまでも文書データを印刷することが最終目的であるワープロにとって,文書データの交換はあまり重要ではありませんでした。最近のワープロ専用機には,文書データを交換する機能を持つものが多くあります)。

図1●統一的なASCIIなら文書データを交換できる
 しかし,コンピュータの世界では,そうはいきません。文書データの交換は,コンピュータの世界で日常的に行なうことだからです。コンピュータの普及に伴い,統一的な文字コードを定めることが必要となったため,1963年にANSI(American National Standards Insutitute,米国規格協会)によってASCII(アスキー)と呼ばれる文字コードが制定されたのです。

 ASCIIは,American Standard Code for Information Interchange(情報交換のための米国標準コード)の略称です。ASCIIという名前の中に,Information Interchange(情報交換)という言葉が含まれていることから,統一的な文字コード制定の目的が,文書データの交換であったことがわかります(図1[拡大表示])。

●ASCIIの文字コード表

表1●ASCIIの文字コード表
 ASCIIは,1文字を7ビットで表す文字コード体系です。表1[拡大表示]は,ASCIIの文字コード表です(ここでは,日本語Windows環境で表示される文字を示しています。本来のASCIIでは,「\」記号ではなくバックスラッシュです)。7ビット,すなわち7桁の2進数0000000~1111111は,2桁の16進数00H~7FH(この記事では,数値の末尾にHを付けて16進数を表すことにします)で表せます。表1では,16進数の上位桁(横方向)と下位桁(縦方向)で文字コード表を構成しています。例えば,大文字のAの文字コードの値なら,上位桁が4で下位桁が1となっているので,41Hであることが分かります。小文字のzの文字コードの値なら,7AHです。

●制御コードは文字列出力装置を制御する

 ASCIIの文字コードの中で,00H~1FHと7FHは,文字としては表示しない機能を表すものです。これらを「制御コード」と総称します。制御コードは,コンピュータに接続された文字列出力装置を制御します。文字列出力装置と言うと大げさですが,早い話が,ディスプレイやプリンタなどのことです。例えば,テキスト・エディタで文書ファイルを作成中に[Enter]キーを押したとしましょう。これによって,次の文字の入力位置が改行され,カーソル(Windowsではカーソルのことをキャレットと呼ぶこともあります)が次の行の左端に移動します。これは,ディスプレイという文字列出力装置を,[Enter]キーの文字コードによって制御したことに他なりません。[TAB]キーを押して字下げした場合に,文字の入力位置が水平方向に移動するもの,文字コードによる文字列出力装置の制御です。ディプレイと同様に,プリンタでも,制御コードによって文字の印字位置を制御します。

 テキスト・エディタを操作中は,文字の表示位置の移動などを実現する制御コードであっても,文書をファイルに保存すれば,制御コードの数値が記録されます。[TAB]キーは,09Hという文字コードで記録します。[Enter]キーは,0DH(復帰)と0AH(改行)のペアで記録します(これはWindowsの場合です。UNIXでは0AHだけになります)。

図2●0DHで復帰し,0AHで改行する
 [Enter]キー1回を,2つの文字コードで記録するることに注意してください。これは,ディスプレイが登場する前に使われていたテレタイプ時代の名残りです。テレタイプは,連続用紙に印刷を行うプリンタのようなものです。テレタイプに0DHという文字コードを送ると,次の印字位置が左端に戻ります。これが復帰です。復帰のことをキャリッジ・リターンとも呼び,印字を行うヘッドが戻ることを意味します。テレタイプに0AHという文字コードを送ると,連続用紙が1行分送られます。これが改行です。改行のことをラインフィードとも呼び,連続用紙が行送りされることを意味します。テレタイプでは,復帰と改行のどちらか一方だけを行うことがあるので,それらを別々の動作とする必要があったのです。それが,現在のディスプレイやプリンタに,そのまま引き継がれています(図2[拡大表示])。

●おぼえておくべき文字コードの値

 コンピュータに関わっている人なら,ASCIIのコード表は暗記するべきでしょう。ただし,すべてを暗記する必要はありません。制御コードの中では,改行(0AH)と復帰(0DH)だけを覚えれば十分です。これらは,文書ファイルにおいて行末の区切りとなるからです。文字を表すコードの中では,スペース(20H),0(30H),A(41H),a(61H)だけを覚えれば十分です。スペースは,英単語の区切りとなります。ASCIIでは,0~9,A~Z,a~zが連続した値の文字コードとなっています。0,A,aの文字コードを覚えておけば,5なら30H+5H=35H,Gなら41H+6H=47H(指折り数えてAの6個先なので),pなら(指折り数えてaの15個先なので)61H+FH=70Hであることがわかります。どうです,簡単でしょう!

図3●文字コードをおぼえればダンプ・リストが読める
 ASCIIの文字コードをおぼえると,文書ファイルのダンプ・リストを読めるようになります。ダンプ・リストとは,文書ファイルの解析のために,ファイルの内容を1文字ずつ16進数の文字コードで表したもののことです。例えば図3[拡大表示]は,「This is a pen.(復帰)(改行)My OS is Windows 2000.(復帰)(改行)」という文書のファイルのダンプ・リストです。このファイルは,ASCIIで保存されています。ここでは,「狐's バイナリエディタ for Win95/NT」というフリーウエアを使ってダンプリストを表示させています。文字コードを操作するための便利なフリーウエアについては,連載第5回で紹介します。

●ASCIIコードに半角カタカナを追加したJIS X 0201

 ご存知のことと思いますが,8ビットのPCが登場したときから現在の32ビットPCに至るまで,ほとんどのプロセッサは,8ビットを基本単位として処理を行っています(32ビット・プロセッサなら32ビットを同時に処理できます)。メモリーやディスク媒体に記録するデータの基本単位も8ビットです。ASCIIは,英語の文書のために作られた文字コードなので,7ビットを使った128通り(27=128)の文字だけで十分でしたが,実際には最上位ビットを0にした8ビットで取り扱われています。これでは,ちょっともったいない気がしますね。

表2●JIS X 0201の文字コード表
 それなら,いっそのこと,8ビットの文字コードを使ったらどうでしょう。文字コード表の横方向のサイズが2倍に拡張されることになり,全部で256通り(28=256)の文字が表せます。ASCIIを8ビットに拡張し,それによって得られた128個分の追加領域に半角のカタカナや句読点などを割り当てたら英語と日本語の両方の文書が表せます。このような考えで制定されたのが,JIS X 0201と呼ばれる文字コード体系です(漢字を表せる規格は,JIS X0208:1997などであり,ここで説明するJIS X 0201とは異なります)。

 表2[拡大表示]は,JIS X 0201の文字コード表です。表の左半分すなわち文字コード00H~7FHまでに割り当てられている文字は,基本的に(05Hと7EH以外)ACSIIと同じです(ピンクの領域)。表の右半分の一部に半角カタカナと句読点などが割り当てられています(水色の領域)。グレーの領域は,未使用であり,文字が割り当てられていません。

 ただし,JIS X 0201の半角カタカナの文字コードをおぼえる必要はありません。半角カタカナは,Webページやメールで文字化けの原因となるので,嫌われる存在となっているため,使われなくなってきているからです。8ビットを使って,ASCII+半角カタカナを表すコード体系が存在することだけを知っておいてください。

●文字が表示される仕組み

図4●キャラクタ・ジェネレータは,文字のフォントを記録したROMである
 最後に,文字コードが文字の形状としてディスプレイやプリンタに表示,印字される仕組みを説明しておきましょう。コンピュータやプリンタは,キャラクタ・ジェネレータ(character genarator,文字生成装置)と呼ぶROM(Rad Only Memory:読み出し専用メモリー)を内蔵しています。このROMは,文字のフォント(形状データ)を格納しています。例えば,1つの文字を横8ビット×縦8ビットの点の集合として表すキャラクタ・ジェネレータは,連続した8バイト(1バイトで横8ビットの点を表します)のメモリー領域に1文字分のフォントを格納します。図4[拡大表示]は,100番地~107番地にAという文字のフォントを格納しているイメージを示したものです。ここでは,1つの四角が1ビットで,■と□が1と0を表します。

 ASCIIの128種類(制御コードを除くので,実際には,79種類)の文字のフォントを保存するためには,8バイト/文字×128文字=1024バイト=1Kバイト(K=1024とします)の容量が必要となります。JIS X 0201の256種類の文字なら,ASCIIの2倍の2Kバイトとなります。それほど大きな容量ではないので,ハードウエア的に文字のフォントを記録することは容易です。ただし,横8ビット×縦8ビットの点の集合で表されたフォントでは,見た目に貧弱であり,複雑な形状の文字を表すことができません。

 キャラクタ・ジェネレータが使われていたのは,パソコンのOSとしてMS-DOSを使っていた時代のことです。Windowsでは,キャラクタ・ジェネレータは使わず,OSがフォント・ファイルから文字の形状を取得するようになっています。特にTrueTypeと呼ぶフォント・ファイル(現在はTrueTypeが主流です)には,点の集合ではなく,滑らかなベクトル情報として文字の形状が記録されています。文字の形状は,ディスプレイ・コントローラと呼ぶ装置に装備した数MBの容量を持つメモリー上に細かな点の集合として表され,それがディスプレイに転送されます。プリンタの場合は,大容量のROMにフォント・ファイルの情報を記録しているか,Windowsからグラフィックス・データとして文字の形状を送ってもらうようになっています。

 もしも,キャラクタ・ジェネレータに記録された文字のフォントを見てみたいなら,パソコンのBIOSセットアップ画面を見てください。BIOSセットアップ画面には,PCに一切のソフトウエアがインストールされていない状態でも文字が表示されます。これらの文字のフォントは,キャラクタ・ジェネレータから取得したものだからです。

 何事にも言える事ですが,基本をマスターすることは,とても重要なことです。基本がわかれば,応用もできます。新しい技術も容易に理解できます。ASCIIの知識は,文字コードの基本となるものです。今後の連載の中で,様々な文字コードに触れることになりますが,ASCIIと比較すれば,その仕組みや特徴を理解できるはずです。「ASCIIなんて昔の文字コードだ」などと思うのは間違いです。ASCIIは,今でも現役バリバリで使われ続けています。

 次回は,JISコード,シフトJISコード,Unicode,EUCコードを説明します。お楽しみに!

(→「第3回 漢字を表す文字コードは一種類だけじゃない」を読む)