• ベストアンサー

特殊文字を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されたものは受け取り先でもそのまま「"」だと思っていたので、「"」を元の「"」に置換する処理を入れていたのですが・・・ 基本的なことだと思いますが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • leaz024
  • ベストアンサー率75% (398/526)
回答No.2

質問文内の実体参照(&quot; や &amp;)が元の文字に戻されてしまったようですね。(これはここのサイトに昔からあるバグです。) 本題ですが、実体参照はブラウザ内では「参照文字そのもの」として扱われますので、&quot; は " として %22 にエスケープされてから送信されます。 この変換は送信メソッド(POST、GET)には関係なく行われます。

qoozy257
質問者

お礼

あ!勘違いしていたことに今気づきました。 POSTなどで変換するのはサーバ側ではなく、ブラウザ側でしたね(^^ゞ Dpopさんがおっしゃっていたのはこのことですね・・・ だから、受け取り側ではPOST・GETにかかわらずURLでコードしなければならないと。 これですべてすっきりしました。 ただ、ブラウザによっては変換しないものもあるんでしょうか?

その他の回答 (2)

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.3

> ブラウザによっては変換しないものもあるんでしょうか? 実体参照の変換(例:&quot; → " )は、どのブラウザでも必ず行われます。(これはブラウザがHTMLを受け取った時点で変換されます。) また、送信時に行われるエスケープ処理( " → %22 )も、ブラウザによらず必ず行われます。

qoozy257
質問者

お礼

何度も、ご丁寧にありがとうございます。 これで、すべてすっきりしました。 基本的なことを忘れずにこれからもPerlに励みます。 本当にありがとうございました。

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

Web屋です。OkWebの様なサイトを作る仕事をしています。 うーん。遣りたい事が今ひとつ良く分かりません。 「"」を送りたいのであれば、送る側でURLエンコードをしてから送り、受け取った方でURLデコードを実行しましょう。 「"」を送ると「%22」に自動的に変換される。と書かれていますが、これは全てのサーバーでこの様な動作をする。と言う保障は無い様な気がします。 ついでに、変換されるのはGETの時かと。 > となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「"」に置換して 1番目の「"」と、2番目の「"」は同じ文字では無いですか? これでは変換している意味は無いですよね?

qoozy257
質問者

お礼

leaz024さんのご指摘で、勘違いしていることに気づきました。 変換するのは、サーバ側ではなくブラウザ側でした。 ありがとうございました。

qoozy257
質問者

補足

今まで私が使ったサーバは、POSTのときURLエンコードしてくれていたようなので・・・勘違いだったのかもしれませんが。 もちろん、GETの時は自分でURLエンコード・デコードする処理を入れています。 >1番目の「"」と、2番目の「"」は同じ文字では無いですか? すみません、これは質問を書き間違えてました。 正しくは、 となってしまい、POST先では値がなしになってしまうため、HTML出力する際に「"」を「&quot;」に置換して <input type="hidden" name="xxx" value="&quot;"> としています。 です(&は半角のアンパサンドです)。 どうやら、質問文でアンパサンドも半角で書いたため、HTML表示のときに「"」になってしまっていました。 この「hidden」属性の値がPOSTされた際、「&quot;」となっていると思ったのですが、「"」となっているのです。

関連するQ&A