2バイト文字系の文字コード
1バイト文字のコードと2バイト文字のコードの区別
1バイト文字だけの文字列、2バイト文字だけの文字列に完全に分かれていれば問題ないのですが、「ABあいCDEF亜」のように1バイト文字と2バイト文字が混在している場合、文字コードから文字に戻すときに問題が生じることがあります。
いきなりですが、問題です。
次の8バイト分のJISコードを文字に戻すと、どんな文字になるでしょうか。コードは16進数表記です。
42 58 41 52 53 47 48 56
参考に、コード表の一部を載せておきます。一部だけなので、問題を解くためには、ここに書いていない文字コードが必要かもしれません。
正解は??
「BXARSGHV」と解いた人もいると思います。2バイトづつまとめて「替倉喃番」と解いた人もいると思います。
「BX倉SG番」や「B愾厶G番」のように文字に戻すこともできます。
JISコードの場合、コードが並んでいるだけだと、それが1バイト文字に戻るのか、2バイト文字に戻るのかが、わからないのです。
------
解決案としてまず思い浮かぶのは、1バイト文字の文字コードと2バイト文字の文字コードの区別が付くように文字コードの前に印を付けちゃえ、という案です。
上のように1バイト文字の印、2バイト文字の印を付けてあげるとどっちのコード表を使えばいいか解るので、「替倉SG番」と戻せばいいとなります。
------
頭の良い人が、別の案を考えました。
JIS8文字コードでは、8、9、E、Fの列が空いています。(下の表の緑色の部分)
1バイト文字と2バイト文字で同じコードを使っているからわからないので、2バイト文字は1バイト文字の空いている場所を使えばいいじゃないかという案です。
例えば、42や7AはJIS8のコード表を見ると「A」や「z」という文字です。これらは、JIS8のコード表上に有るので、1バイト文字とします。一方、8A 9Bという文字コードならば、JIS8のコード表には8Aとか9Bの文字は無いので、これは2バイトのコードだな、ということになります。
E1 41の並びも2バイト文字かな、ということがわかります。2バイト目の41は「A」ですが、1バイト目のE1は空いているところなので、次の41は「A」ではなくて、2バイト文字の2バイト目だ、ということになります。
上では、JIS8の場合で説明しましたが、ASCIIやEBCDICでも空いている場所はあるので、同じように考えることができます。
前者の印を付けるタイプの欠点は、印の分だけデータサイズが増えることと、1バイト文字と2バイト文字が混在した場合、印が何個必要なのかわからないので、文字列を保存するために必要とするデータサイズをあらかじめ予想しにくいことです。
後者の1バイト文字コード表の空いている場所を使うタイプの欠点は、表現できる文字の数が少なくなることです。上の例では、8x、9x、Ex、Fxの列の数字だけしか2バイト文字コードに使えません。