Web2Roomというものを設置してみました。 主氏のMXCCtrlを利用したWPNチャットのWebクライアントですが、 自動でうちの部屋名を指定できるようにCGIを設置してみました。
なかなか便利なので好評なのですが、常連さんに「ハンドルネームの保存が出来るとうれしいなぁ~」 とか言われたのでクッキーを使用して保存することに。ところが何故かクッキーから読み出した情報が文字化け。何故だ。
とりあえず色々と調べてみるとうちのWebサーバに使用している Windows版 Apache 2.x に存在するバグであることがわかりました。
ご存知のようにクッキーというのは情報自体が保存されるのはサイトを見に来た「クライアント側」、すなわちユーザー側ですが、 それを再度使用するときはクライアント側からサーバにその情報を送信し、サーバはその情報をもとにブラウザに出力します。
ところが Windows版 Apache 2.x では2バイトの文字を正常に処理できないらしく、 ここで文字化けが発生するわけです。
さてどうしたもんかと思っていたところ、要するに2バイト文字をそのまま送らなければいいんだ、ということに気付いたので、 URLエンコード/デコードすることにしました。
具体的にはクッキー保存処理の際に、クッキーに書き込む直前にまず内容を以下のようにエンコード。
$cookie =~ s/(\W)/sprintf("%%%02X", ord($1))/ego;
こうすることで例えばSJISでエンコードした場合、
最低人間 → %8D%C5%92%E1%90l%8A%D4
という文字列に変換され、そのままクッキーに保存されます。あとは再びクッキーを取得して読み込む際に、
$c_name =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/ego;
のようにURLデコードしてやればいいわけです。
というかそういうバグがあること自体初めて知ったわけですが何か(ぇ
Posted by 最低人間@管理人 at 2005年01月21日 06:02