
コンピュータはもともとアメリカ製である。だからアルファベット文字さえ効率的に処理できればよい。ところが日本語、中国語などは漢字を使っている。漢字の特徴は文字の種類がアルファベットととは比較にならないほど大きい。 そのためパソコンで日本語を処理できるようにするためにさまざまな工夫が必要であり、工夫も1通りではなかった。日本語は1つ。漢字も1種類だけど、漢字を表現する漢字コードの種類はいろいろある。たとえば、
などがある。こうした事情の一端を紹介するために用意した。
アースキーASCII(American Standard Code for Information Interchange)コードと呼ばれているアメリカの規格である。コードの種類として、

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

16進数は、2進数が4個連なったものである。といわれて、直ぐ分かる人は、先に進んでもらえるが、そうでない人のために、ちょっとだけ補足しておこう。 1桁がゼロかイチの2つしかない数を、2進数という。スイッチがオンかオフというのは、2進数の例である。旗を揚げるか、おろすか。のろしを上げるか、消すか。 などなど、2進数の例は多い。そうした2種類の可能性を、ゼロとイチに翻訳して、2進数とする。通常、ビット(bit)と呼ばれているものである。 すると、16進数は4ビットで、こんな表に出来る。
| 16進数 | 4ビット |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
| 6 | 0110 |
| 7 | 0111 |
| 8 | 1000 |
| 9 | 1001 |
| A | 1010 |
| B | 1011 |
| C | 1100 |
| D | 1101 |
| E | 1110 |
| F | 1111 |
ASCIIコード表で、Aの文字コードは、16進数の41であった。これは、16進数2桁であるから、4ビットが2個である。
最初の4ビットが、4=0100で、後の4ビットが0=0001だから、
全体では、
| 上位 | 下位 | |
| 41 = | 0100 | 0001 |
ところで、ゼロもしくはイチを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 となる。だから、漢字のように多数の文字がある言語には、文字コード表が大規模になる訳だ。
現在、日本の漢字文コードの基礎になっているのが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バイトコード扱いに戻す。

JISコードは、2バイトコードの文字コードの中に1バイトコードが文字コードの一部として含まれているため、 そうしたコードが本来の1バイトコードなのか、あるいは2バイトコードの一部なのかを区別するために、エスケープ コードを使ってコードの切り替えが必要であった。
こうした面倒を引き起こさずに、1バイトコードと2バイトコードを混在させるアイディアがシフトJISコードである。 そのアイディアとは、2バイトコードの第1バイトにASCIIコードで文字として使われていない部分のコードを採用する というものである。その部分が次の図の赤で示された個所である。

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

ところで、こういう方法がなぜ良いのかを説明しよう。シフトJISでも第2バイト目にアスキーコードを含んでしまう点は、JISコードと同じである。 しかし、漢字コードなら、第1バイト目は、アスキーコードの文字の部分ではないことが確約されているので、それをチェックすれば、漢字かどうかが 判定できるのだ。
たとえば、『北』のシフトJISコードは966Bである。2バイト目は6Bで、これは文字『k』である。ところが、1バイト目は96で、 これはアルファベットの文字領域に含まれていない。それで、6Bは、1バイトコードのkではなくて、966Bという2バイトコードであることが確認され、 『北』と解釈される。
シフトJIS(SJIS)の大きな効用は、コードの長さと実際の文字のバイト数が一致することが大きい。 これは、切り替え機能を果たすエスケープ記号など、実際には文字にならない記号が含まれていないためである。