未来のいつか/hyoshiokの日記

hyoshiokの日々思うことをあれやこれや

シフトJISの誕生

パソコンで最もよく利用されているエンコーディングの一つがシフトJISなのだが、その誕生については、なかなかまとまった資料がない。当時の関係者の証言を断片的にまとめたものしかない。
まづ小形さんの以下のBLOGとコメントを読む。当時の当事者が証言をしている。
http://d.hatena.ne.jp/ogwata/20051228/p1 シフトJISを発明したのは誰か?
http://d.hatena.ne.jp/ogwata/20051229/p1 シフトJISを発明したのは誰か?(2)
http://d.hatena.ne.jp/ogwata/20051230/p1 「BASIC80を漢字化した経理専用マシン」のこと
http://d.hatena.ne.jp/ogwata/20060102/p1 たくさんのコメント、ありがとうございます
安岡さんの日記も参考になる。
http://slashdot.jp/~yasuoka/journal/334730
情報処理学会の研究会資料(手書きだ、なんと)
http://fw8.bookpark.ne.jp/cm/ipsj/search.asp?flag=6&keyword=IPSJ-ARC82026002&mode=PDF


古川さんの証言

三菱電機のMulti-16で採用されていたコードとアスキーとマイクロソフトが開発したシフトJISでは空白文字コードが違うという話がでている。

さてMulti-16のCP/M86で最終的に採用されたコードは、デジタル・リサーチ側の抵抗にあって、ShiftJISと関係の無いものになってしまいました。
それは、スペースコードの取り扱いで、アスキー+マイクロソフトの定義では、1バイトのスペースコードは20hですが、2バイト系のスペースは別途定義したダブル幅のスペース
コードと文字データを定義するというものでしたが、デジタル・リサーチ側は2バイトの2020hで代用する、という定義を主張しました。

空白は制御記号的な意味合いもあるので、0x2020としたというのはある意味ハックではあったんだけど、2バイトの空白には制御文字的な意味合いを持たせないというプラクティスが広がったため、三菱電機が採用した方式は主流にはなれなかったような気がする。デファクトを確立することの難しさというか。シフトJISの2バイト空白は0x8140で、空白なので文字は見えないけど特別な意味はない。0x20は空白としての意味をいろいろなコンテキストで持つ。(コマンドを分離したり、プログラミング言語では字句を分離したりするのに使われたりする)

TLV -- Tag Length Value

古典的なデータ構造としてTLVというのがある。Tag Length Valueの3つ組。
Tagの部分にデータ型をいれ、Length部分にOctet長を、Valueのところに実際の値をいれるというデータ構造である。このTLVというのは非常に扱いやすいのでネットワークのプロトコルとか、データベースのエンジンとかいろいろなところで利用されている。
Tagによっていろいろ特別なオペレーションを定義できるので簡単に処理を特殊化できたりする。プログラムのコードとしてはcaseとかswitchとかで、あるTagだったら、なんちゃらという処理を追加していけばいい。知らないTagが来たら知らないという処理をすればいいので、安全にTagを拡張追加できる。未定義のTagが出てきたら、すなわち知らないTagでてきたら、Length分データをすっ飛ばせば、取りあえず知らないふりができる。まあ、なんらかのデフォルトの処理をするんだろうけど、安全に無視できる。これ重要である。
なんかObject Orientedですな。Object Oriented ってどういう意味か知らないけど。Lisp的ですな。どういう意味か知らないけど。
それはともかく、データ構造としてはTagが出てきた瞬間、潔く、あ、これ知らない、と判定できるのがいい。
で、唐突に文字コードの話になるんだけど文字列もTLVで表現したら幸せになれる。Tagに文字コードを示す何がしかをいれて(エンコーディングなのか単なる文字集合なのか、それとも他のものなのかは十分吟味すればいいのだけど、ともかくその手の何か)、Lengthには厳密に8ビットで数えた長さを入れ、実際の値をValueに入れる。
ある文字列が等しいかどうかは、Tagが等しければバイナリに比較すればいいし、違うTagの場合はTagの組み合わせルールに従って等価性を定義すればいい。文字列の大小なども同様にいろいろ定義をしていけばいい。
これってCSI -- Code Set Independent な実装に他ならない。
だからどうなのって話なのだがCSIの実装とTLVというのは相性がいいということを指摘して今日はおしまいなり。