#108 混迷の漢字コード(その2)

2000/03/12

<前目次次>


 前回の話の要約。コンピュータで文字を扱うために、まず英語圏で7bitで英数文字その他の記号を表すことのできるASCII文字が決められ、その後各国の文字についてもそれぞれの言語で使われる文字をまとめた「文字セット」が作られてきた、という話。で、次はいよいよそれをコンピュータに実装する「文字コード」の話に入るわけである。

 コンピュータの中でASCII文字とASCII以外の別の文字セットを同時に扱う方法の一つとして、テキストの中にある特定のキャラクタ列を挿入することによって、複数の文字セットを記述するコード体系が考えだされた。それがJISコードと呼ばれるものである。具体的には、テキストの途中にエスケープシークエンスという文字の並びを挿入することによって、以降の文字セットが切り替わることを示すというものである。

 例えば、エスケープシークエンスとして「ESC,$,@」の並びが来ると、それ以降はASCII文字を表し、「ESC,(,B」の並びが来ると、それ以降はJIS漢字を表す、といった具合である。従って「0$阿」という文字列は、順に0,$,ESC,(,B,0,$と記述される。0,$の並びが前と後ろの2回出てきているが、前の0,$の並びはASCIIの「0$」を表し、後の0,$の並びは漢字の「阿」を表している。間のESC,(,@の並びが、キャラクタが表す文字を変える(文字セットを切り替える)働きをしているわけである。

 このJISコードは、7bitのままでASCIIとASCII以外の文字セットを同時に扱えるのが利点だが、欠点として、文字セットの切り換え毎にエスケープシークエンスが入るため、切り換えが多いとテキストのbyte数が膨らんでしまうこと、文字一つだけを取り出すとそれが表しているものが分からなくなる(ASCIIなのかそれ以外の文字なのかわからなくなる)こと、文字とキャラクタが1対1に対応していないため、コンピュータ内部で扱いにくいということがある。

 そこで、数ある文字セットの中からASCII以外に一つを選択し、それらの文字セットについては「8bit目を1にする」ことで(つまり8bitに拡張することで)、ASCII以外の文字セットを同時に表現する方法が考え出された。それがEUC(Extended Unix Code)である。一つの言語について考えれば、通常はASCII以外に一つだけ文字セットが使えれば充分であることが多いので、その点でEUCは非常に合理的な方法と言える。そして、文字セットとして日本語漢字を選択したEUCを特に「日本語EUC」と呼ぶ。(日本で単に「EUC」と言われた場合はだいたいこの「日本語EUC」のことを指していると言っていい。)

 例えばJISコードでは「0$」と「阿」はどちらも同じ0,$の並びだが、日本語EUCでは、ASCIIの方は2進法(ビットの並び)で表すと

  0 = (00110000) $ = (00100100)

となり、一方漢字の「阿」となる方の文字は

  0 = (10110000) $ = (10100100) 2つ組合わせて「阿」

 一番上の桁、つまり8bit目が、ASCIIの方では0で、漢字の方では1になっている。つまりASCIIと漢字が全く違うコードに割り振られたので、もう「エスケープシークエンス」なんてものを使わなくてすむようになったのである。もちろん、日本語圏以外では、文字セットに別なものを選択することによって、例えば「韓国語EUC」などのバージョンもあるわけである。要は、その国にあった文字セットを選択して拡張できるというわけである。EUCはその名の通り、UNIXで漢字などのマルチバイトを表現する方法として一般的に使われている。

 まとめると、ASCII以外の文字セットを扱うために、7bitのままASCIIコードを拡張したものがJISコード、8bit目も使って拡張したものがEUCコードである。これらの拡張はいずれも、ISO 2022で定められた拡張方式に準拠したものであり、言わば「正統」な拡張の方法である。

 ところが、歴史的な経緯から世の中に数多く普及してしまったMS-DOS系のパソコンの世界では、これとは違った文字コードの拡張が行われてしまった。それがShift-JISなのであるが、その話はまた次回に。


<前目次次>