<< 前へ Delusion Storage へ戻る 次へ >>

2003/04/07(月)

アンケート用フォームで複数行入力したとき、改行コードがすべて半角空白に置き換えられてしまうという仕様が発覚。週末じゅう対応に追われる。追われたのでアパートから脱出し、ゲーセンで5時間ほど遊んだり。って駄目じゃん。

この仕様が今まで発覚しなかったのは、サーバーに蓄積されていたフォーム送信データの内容が、実は「改行コード → 半角空白」という変換がきちんと行われていなかったから。言っておくがこの変換をやっているのは私ではない。ブラウザが勝手にやっているか、あるいはサーバー側の CGI がやっているかだ。ブラウザが変わっても改行コードの残り方が同じであるところを見ると、どうやらサーバー側 CGI がやっていると思われるのだが。

どういう残り方をしていたかというと、これがあなた。普通、改行コードってのは CRLF つまり16進コードで言うなら「0x0D0A」なのだが、これが変換後は「0x0D20」すなわち「CR + 半角空白」みたいな変換をされていたのだよ。フォームで送信したデータは CSV 形式で蓄積されているのだが、CR だけが残っているなら途中で行が変わっちゃってデータがぶっ壊れちゃいました、なんてこともない。なるほど、上手い方法を使うもんだなぁ、とその時は感心したのだが、先週末にプロバイダさんのとこで仕様をみたら「改行は半角空白になります」とか書いてやがんの。

つまり CR が残っているのは不具合と考えておいた方が良くて、将来のいつか CR すら残らないようになったとしてもそれは正常な動作なので文句は言えない、ってことだ。CR に頼って改行を受け取るようなことをしていると、ある日突然、身動き取れないことになるかも知れない。つーか、この問題が解決しないと、安心して「アンケート実姉するですぅ」という告知を出せないではないの。

そういうわけで、仕方がないので自力救済を試みることになってしまった。

まあ自力救済と言っても大したことをするわけでもない。フォームを送信するときに、JavaScript を使って改行コードを別の文字に変換してやれば良いだけの話。送信するときにデータを組み立てるというのは良くあることだし、単に文字列を置き換えるだけで済んじゃうから、特に面倒なこともない。ないはず、だった。

私が考えたのは「やっぱ改行なら <br> でしょ」ということで、「改行コード → <br>」という置き換えをすることだった。ただし、これだけやったのでは、アンケートや投稿した内容に最初から“<br>”という文字列が入っていたとき、どっちがどっちなのかわからなくなる。なので、「< → &lt;」とか「> → &gt;」とか、さらには & のエスケープ用にも「& → &amp;」という変換をやっておかねばならない。こうしておけば、もし最初から“<br>”という文字列が入力されていたとしても、それは送信するときには「&lt;br&gt;」という文字列に変わっているはずなので、改行コードが置き換えられた結果の「<br>」と区別できる。こいつは本当にごく簡単な処理なんですぐ出来た。改行したり“<br>”とか“&”とかいう文字列を入力して、即、試せる。

Opera 6.01 のやつが逆噴射かましてくれやがったぞ、くそぅ。

複数行入力を文字変換して送信する実験は、Internet Explorer 6.0 と Mozilla 1.0.1 ではごく正常に成功したのだが。なぜか Opera 6.01 だけは、送信すると「&lt; → <」のような逆変換をかましてしまうらしい。上記の実験では、Opera 6.01 でも特に支障はなかったんだが……フォームを送信すると不具合が出る。いろいろやってみた結果、どう〜も“&”で始まる文字列を、変換してから送信しちゃうようだ。ZooM-Palace には Opera で来てくれる人もいるから「Opera 使ってる人はアンケート駄目よ」とは言えない。いや、JavaScript 使っちゃうのはどうよ、という問題はとりあえず置いといて。(セキュリティ対策のために Script 機能をオフにしてる人って、けっこういるはずだが)

この問題は、いまだに解決できていない。うぬぅ。

フォーム送信は「制服で犬と」の FootNote 投稿をはじめ、いろいろなところで使っていこうと思っているから諦めたくはないんだが。と言っているうちにも 50000 ヒットが近づいて来たりして、ああん、今度のキリ番イベントはアンケートにしようかと思ってたのにぃ。限りなく対応に追われ続ける日々。

対応はそのくらいにしてそろそろ洗濯物を片づけなさい、という現実にも追われているが。あう、もう下着が……。


<< 前へ Delusion Storage へ戻る 次へ >>