read と sysread の違い

シナリオローダのコーディング中、もひとつ気になってたこと。
デコード前のファイルをバイナリで丸ごと読み込む場合に、read と sysread のどっちを使えばええのかっちゅう問題。


とりあえずリファレンスを引くと、違いはバッファリングの有無とある。バッファリング有りの read の方が処理が早そうな気もするが、とりあえずバイナリだから、より低レベルっぽいニヨイがする sysread にしておいた。出力を見たら問題なさそうだったので、それ以上弄らずに先へ進んだ。


しかし実際のところどうなのか気になってたので、該当個所を read に書き換えて出力、fc をとってみた。結果↓

http://www.geocities.jp/den_dro_gram/result.txt


「共演者」が「共猿メ」に化けている。いや化けてるんじゃなくて、バイトが削られてる模様。やっぱり。「演」のコードが SJIS で 0x8989、でもってデコード前の値は 0x84 で XOR だから 0x0D。「者」の上位バイトが 0x8E、0x84 の XOR で 0x0A。


予想通り、read 命令は のバイトオーダーを見つけて、それを に変換している。結果、文字化けが起こると。多分、binmode() を指定しとけば回避できるんだろうけど。


つーか、そんなことも知らないでシナリオローダとか作ってんじゃねえよって感じ? 知らずに地雷を回避している俺ってスゲーとか密かに思ってる私は、多分一生未熟者。