0.はじめに

コンピュータはもともとアメリカ製である。だからアルファベット文字さえ効率的に処理できればよい。ところが日本語、中国語などは漢字を使っている。漢字の特徴は文字の種類がアルファベットととは比較にならないほど大きい。 そのためパソコンで日本語を処理できるようにするためにさまざまな工夫が必要であり、工夫も1通りではなかった。日本語は1つ。漢字も1種類だけど、漢字を表現する漢字コードの種類はいろいろある。たとえば、

  1. JISコード
    コンピュータで使う漢字の基礎になっている。
  2. シフトJIS (Shift JIS)
    パソコンで最も使われている漢字コード。JISコードを体系的にずらしてある。
  3. EUC (Extended UNIC Code)
    シフトJIS同様に、JISコードをそっくりずらして利用している。UNIXマシンで使われている。
  4. ISO-2022-JP
    インターネット時代になってメールなどに使われるようになった。漢字にはJISコードが使われている。パソコンの中ではシフトJISでも、インターネットに送り出されるときにはJISに変えられる。 半角カタカナの扱いがインターネットの中では保証されていないので、使わない方向になっている。
  5. Unicode 2.1
    マイクロソフト、アップル、サン・マイクロシステムズ、オラクルなど多数のソフト関連企業が集まって開発された符号体系。世界中の主要な言語を包括している。

などがある。こうした事情の一端を紹介するために用意した。


1. ASCIIコード

アースキーASCII(American Standard Code for Information Interchange)コードと呼ばれているアメリカの規格である。コードの種類として、

  1. 通信符号 ... ブルーで色づけされた部分
  2. 文字符号 ... オレンジ色の部分
に分けられる。

1.2 表の読み方

表は左右に8列、上下に16行ある。アルファベットのAの文字は、左から5列目で上から、2行目にある。これを行と列に振られた番号で呼ぶと、4列1行つまり、41である。 コンピュータで番号をつける場合は、ゼロから始まるのが習慣である。

さて、上下方向の番号に、A,B,C,D,E,Fがあることに気が付く。これは16進数である。その意味は、

A = 10
B = 11
C = 12
D = 13
E = 14
F = 15

である。16になったら桁上がりするので、16を表示する文字はない。その代わり、10が16を意味する16進数である。 10進数で表記されているのか、16進数で表記されているのかに気を配らないと、危険である。多くの場合、0x10とか、 10Hというように表記されている。ここでは、断らないで書いているが、文字コードは16進数で書かれている。

1.3 日本でのASCIIコード

表の升目は、全体で16X8=128個ある。アルファベットしか使わないアメリカでは、以上の128文字だけで十分であるが、 8ビット符号(1バイトコード)を採用する場合は、128の2倍、256文字が使え、自由に使える部分として残されていた。下記の表の黄色の部分である。 そこで日本では、その部分にカタカナとグラフ文字などを割り当てて使われていた(80から9Fまでと、E0からFFまででがグラフ文字であるが、この図では、グラフ文字が既に無いので省略されている)。 アメリカ文化の文字コードを拡張して多少でも日本語が使えるようにしたものである。この部分のカタカナは「半角カナ」と呼ばれ、インターネットでは使わない方針である。 下記の表は、NECPC8001のコード表である。


2 文字コード、16進数、2進数

2.1 ゼロとイチ

16進数は、2進数が4個連なったものである。といわれて、直ぐ分かる人は、先に進んでもらえるが、そうでない人のために、ちょっとだけ補足しておこう。 1桁がゼロかイチの2つしかない数を、2進数という。スイッチがオンかオフというのは、2進数の例である。旗を揚げるか、おろすか。のろしを上げるか、消すか。 などなど、2進数の例は多い。そうした2種類の可能性を、ゼロとイチに翻訳して、2進数とする。通常、ビット(bit)と呼ばれているものである。 すると、16進数は4ビットで、こんな表に出来る。

16進数4ビット
00000
10001
20010
30011
40100
50101
60110
70111
81000
91001
A1010
B1011
C1100
D1101
E1110
F1111

2.2 アルファベットAの2進数表示は?

ASCIIコード表で、Aの文字コードは、16進数の41であった。これは、16進数2桁であるから、4ビットが2個である。 最初の4ビットが、4=0100で、後の4ビットが0=0001だから、 全体では、

上位下位
41 = 0100 0001

と表示される。左半分を上位ビット、右半分を下位ビットという。表では、左右の列方向が上位、上下の行方向が下位である。 8ビットの単位を1バイトと呼ぶ。だから、ASCIIコードは、1バイトコードである。

2.3 1バイとは何種類?

ところで、ゼロもしくはイチを8個組み合わせると、一体何種類の組み合わせがあるだろうか?
2個選ぶことができるものが、8個連続するから、答えは、

2 X 2 X 2 X 2 X 2 X 2 X 2 X 2 = 28 = 256

である。

ちなみに、2バイト、16ビットあれば、何週類の文字を識別できるだろうか?

解答:  256 X 265 = 65535  となる。だから、漢字のように多数の文字がある言語には、文字コード表が大規模になる訳だ。

2.4 練習

  1. 文字BのASCIIコードを16進数では、どう書くか?
  2. 文字bのASCIIコードを16真数では、どう書くか?
    それらは、2進数ではどう書かれるか?

3. JISコード

現在、日本の漢字文コードの基礎になっているのが1978年に制定さたJIS X 0208である。1997年に3回目の改定が行われ、よく使われる第1水準文字と、使われる頻度は少ないが人名などで必要とされる第2水準文字との6879文字が決められいる。 ところで、このJISコードの体系は、区点コードとも呼ばれている。それは、漢字を94の区に区切り、その中の漢字を94点で区別する方法である。漢字は、訓読みでアイウエオ順で並べられている。下の図に概略を示す。

94X94の領域に配置された漢字を2バイトコードとして使うために、1バイト目と2バイト目を下図の場所に配置することでコード化した。 これがJISコードである。

しかし、この領域では、2バイトコードの中にアルファベットの文字コードが含まれ、どっちのコードと解釈したら良いのか混乱する可能性がある。 たとえば、『北』のJISコードは、4B4Cである。でも、このコードは、1バイトコード4Bと4Cが連続しているとも見ることができる。 その場合には、4B4Cは、KLと解釈される。

1バイトのアルファベットなのか、2バイト文字なのかを区別するために使われたのが、特殊なエスケープ文字(KIとKOと表記されていた) である。各エスケープ文字の意味は、KIがこれから後ろの文字を漢字扱いにし、KOは漢字から出て1バイトコード扱いに戻す。

  1. JISコードの表1
  2. JISコードの表2

4. シフトJISコード

4.1 JISコードの欠点

JISコードは、2バイトコードの文字コードの中に1バイトコードが文字コードの一部として含まれているため、 そうしたコードが本来の1バイトコードなのか、あるいは2バイトコードの一部なのかを区別するために、エスケープ コードを使ってコードの切り替えが必要であった。

4.2 シフトJISコードのアイディア

こうした面倒を引き起こさずに、1バイトコードと2バイトコードを混在させるアイディアがシフトJISコードである。 そのアイディアとは、2バイトコードの第1バイトにASCIIコードで文字として使われていない部分のコードを採用する というものである。その部分が次の図の赤で示された個所である。

次の図では、JISコードをSJISのコードに対応付ける基本的な方策を示している。シフトJISの基本アイディアに従って、 JISコードのブロックを順番に詰め込んで(シフトして)いる。

4.3 シフトJISの効用

ところで、こういう方法がなぜ良いのかを説明しよう。シフトJISでも第2バイト目にアスキーコードを含んでしまう点は、JISコードと同じである。 しかし、漢字コードなら、第1バイト目は、アスキーコードの文字の部分ではないことが確約されているので、それをチェックすれば、漢字かどうかが 判定できるのだ。

たとえば、『北』のシフトJISコードは966Bである。2バイト目は6Bで、これは文字『k』である。ところが、1バイト目は96で、 これはアルファベットの文字領域に含まれていない。それで、6Bは、1バイトコードのkではなくて、966Bという2バイトコードであることが確認され、 『北』と解釈される。

シフトJIS(SJIS)の大きな効用は、コードの長さと実際の文字のバイト数が一致することが大きい。 これは、切り替え機能を果たすエスケープ記号など、実際には文字にならない記号が含まれていないためである。

  1. シフトJISの表1
  2. シフトJISの表2