昨日の19時40分~50分頃でしょうか。
Skill Attack Version 3、ていうかSkill Attack開設以来の壮大なバグが発覚。
ちょうど、⊂㌍㌢!⊃さんの名前をシステムに対応すべく JavaScript をいじったりした後だったから、何か直し間違えたかな?と思ったけど、TOP画面で出力された JavaScript のエラー文を見てみる限り、どうやら事情は違うらしく。
JavaScript で、ユーザーの名前を変数に代入しようとするところで文法ミスが出ていました。該当箇所をよく見てみると、名前を囲むためのシングルクォートがエスケープされていたのですけど、何故そのような事が起こったのかというと・・・
CGIで特定の文字(表・予・申・能など)が文字化けする
http://www.shtml.jp/mojibake/sjis_cgi.html
後方エスケープ。
DDRでは、「CAN'T STOP FALLIN' IN LOVE」等のように、名前にシングルクォートが含まれる曲が数多く存在します。それらを JavaScript で変数に代入しようとする時に、そのまま 'CAN'T STOP FALLIN' IN LOVE' のように記述すると文法エラーを起こしてしまうので、PHP側で、曲名のシングルクォートを \' に変換する必要があります。
そこで、PHPの標準関数 addslashes() を取り入れてみました。エスケープが必要な文字列をエスケープしてから返してくれるので、「じゃあ、JavaScriptで代入処理させる文字は全てこれを通せばいいんじゃない?・▽・」と思ったまでは良かったのですけど・・・
この addslashes() 関数、シングルクォートやヌル文字といった前方エスケープだけでなく、「表」「ソ」「申」「十」といった、Shift_JISの2バイト目が 0x5C の文字もしっかり後方エスケープして下さいます。
以上を踏まえて。
昨日、「ナイソ」さんが新規登録されました。
JavaScript で名前を代入するために書き出された文字列は
'ナイソ\' となるわけですが・・・
ここから先の話は、またの機会に。
ちなみにその数日前、同じ 0x5C を2バイト目に持つ「十」を名前に含んだ、「A-Y(元十字)」さんが登録を行っていたにも関わらず何も起こらなかったのは何故でしょう。
厳密には少し違いますが、大まかに説明すると以下のような理由です。
http://www.shtml.jp/mojibake/sjis_cgi.html
では、「print "私の名前は田中太\郎です。";」とすると、どう表示されるでしょうか? ここでは、「\マーク」は無視され、「私の名前は田中太郎です。」と出力されます。エスケープが必要のない文字の前に「\マーク」をつけても無視されるわけです。
最後に、今回の件で勝手に名前を挙げてしまいましたが、
ナイソさんやA-Y(元十字)さんは全く悪くないんで!
そこだけは間違いの無いようお願いします。
最近のコメント