- ベストアンサー
特殊文字をPOSTした際の動作は?
特殊文字はPOSTした際、「"」は「%22」などに内部でURLエンコードされ、受け取り元では元の文字にURLでコードされているはずですが、これに絡んだ動作がいまいち理解しきれないので、お教え願えればと思います。 フォームで、テキストエリアに「"」などを入力してPOSTし確認表示させる際に、HTML出力する際に最終の処理をするCGIへPOSTするために「hidden」属性でPOSTするためのデータを持たせています。 ただ、そのままだと <input type="hidden" name="xxx" value="""> となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「"」に置換して <input type="hidden" name="xxx" value="""> としています。 これをPOSTした際、受け取り元でデータを見ると、予想ではそのまま「"」となっているはずでしたが、なぜかちゃんと「"」に戻されています。 ほかの「&」なども同様でした。 これは、正常なのでしょうか? 自分は、POSTされたものは受け取り先でもそのまま「"」だと思っていたので、「"」を元の「"」に置換する処理を入れていたのですが・・・ 基本的なことだと思いますが、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問文内の実体参照(" や &)が元の文字に戻されてしまったようですね。(これはここのサイトに昔からあるバグです。) 本題ですが、実体参照はブラウザ内では「参照文字そのもの」として扱われますので、" は " として %22 にエスケープされてから送信されます。 この変換は送信メソッド(POST、GET)には関係なく行われます。
その他の回答 (2)
- leaz024
- ベストアンサー率75% (398/526)
> ブラウザによっては変換しないものもあるんでしょうか? 実体参照の変換(例:" → " )は、どのブラウザでも必ず行われます。(これはブラウザがHTMLを受け取った時点で変換されます。) また、送信時に行われるエスケープ処理( " → %22 )も、ブラウザによらず必ず行われます。
お礼
何度も、ご丁寧にありがとうございます。 これで、すべてすっきりしました。 基本的なことを忘れずにこれからもPerlに励みます。 本当にありがとうございました。
- Dpop
- ベストアンサー率51% (279/544)
Web屋です。OkWebの様なサイトを作る仕事をしています。 うーん。遣りたい事が今ひとつ良く分かりません。 「"」を送りたいのであれば、送る側でURLエンコードをしてから送り、受け取った方でURLデコードを実行しましょう。 「"」を送ると「%22」に自動的に変換される。と書かれていますが、これは全てのサーバーでこの様な動作をする。と言う保障は無い様な気がします。 ついでに、変換されるのはGETの時かと。 > となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「"」に置換して 1番目の「"」と、2番目の「"」は同じ文字では無いですか? これでは変換している意味は無いですよね?
お礼
leaz024さんのご指摘で、勘違いしていることに気づきました。 変換するのは、サーバ側ではなくブラウザ側でした。 ありがとうございました。
補足
今まで私が使ったサーバは、POSTのときURLエンコードしてくれていたようなので・・・勘違いだったのかもしれませんが。 もちろん、GETの時は自分でURLエンコード・デコードする処理を入れています。 >1番目の「"」と、2番目の「"」は同じ文字では無いですか? すみません、これは質問を書き間違えてました。 正しくは、 となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「&quot;」に置換して <input type="hidden" name="xxx" value="&quot;"> としています。 です(&は半角のアンパサンドです)。 どうやら、質問文でアンパサンドも半角で書いたため、HTML表示のときに「"」になってしまっていました。 この「hidden」属性の値がPOSTされた際、「&quot;」となっていると思ったのですが、「"」となっているのです。
お礼
あ!勘違いしていたことに今気づきました。 POSTなどで変換するのはサーバ側ではなく、ブラウザ側でしたね(^^ゞ Dpopさんがおっしゃっていたのはこのことですね・・・ だから、受け取り側ではPOST・GETにかかわらずURLでコードしなければならないと。 これですべてすっきりしました。 ただ、ブラウザによっては変換しないものもあるんでしょうか?