Windows は Shit_JIS をしゃべらない

ということをつい最近知った私の衝撃を理解してもらえるだろうか?
リアルで付き合いのある方はご存知の通り、2 バイトコード関連の問題は私にとって専門と言っても良い領域だったのだ。それなりに真面目に勉強してたつもりだったんだが、こんな根本的な部分で考え違いをしていたっつーのは恥ずかしいことこの上ない。穴があったら入りたい。


DOS 時代を体験してる世代なら説明するまでもないだろうが、M$ の OS はコードページ(CP)という概念によって多言語処理に対応している。日本語なら CP932、ハングルなら CP949、中国語 Big5 なら CP950 といった具合で言語モードを切り替えるわけだ。もっとも現行の Windows であれば、Shift_JIS の符号化を用いる CP932 の他にも複数の日本語コードページがサポートされている。


CP932 = Shift_JIS : ほぼ全ての日本語アプリでデフォルト
CP50220 = ISO2022-JP
CP51932 = EUC=JP
CP65001 = UTF-8


HTML など Web 上での可読性を重視するものは EUC や UTF で保存することもあるだろうが、そういったケースを除けば概ね Windows 上の日本語テキスト = Shit_JIS と考えて問題ないわけだ。実際、多くの技術系の書籍・HP でそのように説明されている。


だが正確には CP932 とは Shif_JIS をベースに独自拡張文字を加えた規格を言う。文字セットという観点から見た場合…


Shift_JIS ≠ CP932
Shift_JIS ⊂ CP932


なわけだ。では CP932 では定義されていて Shit_JIS にはない文字とは具体的にはどんなものか? 区点番号で言うと 13 区および 89〜92区に割り当てられた文字がそれだ。


Row number 13:
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ・㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡・・・・・・・・㍻〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮�槇紜蘗椨琰硎茴羨澄Α�
Row number 89:
硃硎硏硑硨确碑碰𥔎碭磤磲礀磷礜礮礱礴社祉祅祆祈祐祖祜祝神祥祹禍禎福禘禱禸秈秊𥝱秔秞秫秭稃穀稹穝穭突窅窠𥧄窳窻竎竫竽笒笭笻筇筎筠筭筯筲箞節篗篙簁簱簞簠簳簶䉤𥶡籙籭籹粏粔粠粼糕糙糝紇紈紓紝紣紱
Row number 90:
絁絈絓絜絺綃綋綠綦緂緌緖緣練縨縈縑縕繁繇繒繡纊纍罇署羑羗羿翎翛翟翬翮翺者耔耦耵耷耼胊胗胠胳脘腊腠腧腨腭膻臊臏臗臭䑓䑛艠艴𦫿芎芡芣芤芩芮芷芾芿苆苕苽苾茀茁荢茢茭茺荃荇荑荕荽莆莒莘莧莩莿菀菇菏
Row number 91:
菑菡菪萁萆萊著葈葟葰葳蒅蒞蒯蒴蒺蓀蓂𦹀蔲蔞蔣蔯蕙蕤﨟薭蕺薌薏薢薰藋藎藭蘒藿蘄蘅蘐𧃴蘘蘩蘸虗虛虜虢䖝虬虵蚘蚸蛺蛼蛽蜋蝱螇螈螬螭螵䗪蟖蟬蠆蠊蠐蠔蠟袘袪裊裎𧚄裵褜褐褘褙褚褧褰褲褹襀覔視觔觥觶訒訕
Row number 92:
訢訷詇詎詝詡詵詹誧諐諟諴諶諸謁謹譆譔譙譩讝豉豨賓賡賴賸賾贈贒贛趯跎跑跗踠踣踽蹰蹻𨉷軀䡄軺輞輭輶轔𨏍辦辵迤迨迮逈逭逸邈邕邗邙邛邢邳邾郄郅郇郗郝郞郯郴都鄔鄕鄖鄢・・鄯鄱鄴鄽酈酛醃醞醬醱¬釗釻釤


なんだ………機種依存文字のことじゃん(というわけで Windows 以外では多分この上部分は表示されないか化けてると思う)。


いや、そうだよ? そうなんだけどね?
もちろん「機種依存文字」という概念は知ってたさ。仕事で 2 バイトコード関連のバグチェックをやってたときには、0x5C 問題検出用に加えて機種依存文字関連のデータもテストで必ず通してたし。それらがどういうシチュエーションで問題になるのかといったことは常に認識していた。


でもその時は「機種依存文字」とは「Mac で表示できない Shit_JIS文字」であると認識してたわけで、まさかもともと Shift_JIS という規格に含まれていない文字なんだとは思いもしなかったわけ。


だってそうでしょ? もともと Shift_JIS 自体 M$ が中心になって策定された規格なんだから、M$ の OS の実装 = Shif_JIS だと思うじゃん。自分で苦労して作った規格にわざわざ独自拡張を加えるベンダーの方がトチ狂ってると思いません?


まぁ実際のところ、これらは単なる言葉の定義の問題なのであって、Shift_JIS という用語が厳密には何を指しているのかなど知らなくても困ることは殆どない。多くの場合、Windows 上で作成したデータは Windows 上で読み書きできれば良いのであり、Mac 上で作成したデータは Mac 上で読み書きできれば良いのだ。


だけれども、Perl のようにプラットフォームに対してインディペンデントな処理系でのテキスト処理を考えた場合、この辺りの厳密な定義が意外と問題になるかもよ? てなお話を少ししてみたかったりするのだ。