シフトJISって何バイト?

昨日のwindresの調べごとをしている最中に、同じ質問を見つけた。20年前の私に問えば、怪訝な顔をして2バイトと答えたであろう。しかし、この20年、妙な仕事をしてきた今の私に問えば、2〜4バイト、ただし今は封印されて2バイトじゃない?と答えるだろう。
妙な仕事と書いたが、何てことはない、データを任意の位置で区切って、そこが漢字(シフトJIS)の途中だったら、前に寄せるか、後ろに送るか指示された通りにずらすと言った、ちょっとしたフィルタの作成だ。
文字コードの癖に多少手こずりはしたが、それ程時間は掛からずに、それは完成した。
テキストファイルを処理する分には何の問題はなかったが、ある人物がよりにもよって実行ファイル(バイナリ)をぶち込んだのだ。一応、制御コード(0x01〜0x1f)をテキストファイルに書かれる可能性を考慮していたので、正常に動作するかと思われたが、どうも挙動がおかしい。2行に分かれるべき箇所が1行に繋がったり、別の文字を浸食して指定した文字数未満しか表示されていなかったりと、奇妙なことだらけだった。
動作から察すると、明らかにシフトJISの途中を見誤っている症状だ。しかし、奇妙なことは続く、手動で計算し直しても、正しい位置で区切っているのだ。だがしかし、表示すると前記の挙動になる。
そこで、端末仕様書、仮想端末のフォント情報、文字コードの仕様書をひっくり返して見直すはめになったのだ。
するとそこには、シフトJISの末尾の方に(すまん、今となっては、そのコード群が何番かは出てこない)3バイトシフトJISの領域と、4バイトシフトJISの領域が広がっていたのだ。つまり、2バイトでASCII 2文字分を構成していると思ったら、実は3バイトや4バイトで構成していたため、その後に続く文字を食ったりしてASCII 2文字分になっていたのだ。
そう、完全な思い込みでコーディングしていたのだった。まあ、ついでに、その後ろの領域にユーザ定義文字の領域を見つけ、どう扱うかを悩んだりもしたが、それはまたべつの話。
結局、調べていくと3バイト、4バイトシフトJISには文字がマップされておらず、実は将来の拡張領域として用意されているため、空白文字として扱えば良かったので、問題はスムーズに解決した。
今更ながらwikipediaを読んでいるが、一切その存在は触れられておらず、またユーザ定義文字の領域は封印された様であるから、たぶん文字がマップされていない3バイト、4バイトシフトJIS黒歴史に葬り去られたのだろう。なにせ文字が無いのだから封印されても誰も困らないからね〜