perlにおけるhttpリクエスト時のエンコードとデコードにおける下記の問題について、教えてください。
*問題点
コメント欄のコードでデコード処理をしています。
このままだと、ブラウザ側で'+'の文字列を含めたリクエストを送ると、サーバー側でリクエストを処理する際に、'+'が半角スペースに置換されてしまいます。(期待している挙動:'+'は別の文字コードにエンコードされ、 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;の処理でデコードされる)
$value =~ tr/+/ /;の処理をコメントアウトすると、'+'が半角スペースに置換される問題が解消されます。また、半角スペースのデコードがされないはずなのに、半角スペースが正常に処理され、全く問題がないように見えます。
これは、下記の私の認識と食い違います。どなたかご存知の方がいらっしゃいましたら、解説をお願い致します。
*現状の私の認識
urlにリクエストを投げるときの半角スペースは+にエンコードされるため、
サーバー側(perl側)で+を半角スペースにデコードしなければならない。
よろしくお願い致します。
"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?
だとしたら、 + は %2Bとして送るべきです。
この辺でしょうか。
http://d.hatena.ne.jp/koyuking248/20101129/1291034025
あと、URI::escapeというモジュールもありますね。
"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?
だとしたら、 + は %2Bとして送るべきです。
この辺でしょうか。
http://d.hatena.ne.jp/koyuking248/20101129/1291034025
あと、URI::escapeというモジュールもありますね。
回答ありがとうございます。
>"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?
質問がわかりにくくてすみません。
問題は2つあります。
1つ目の問題は、通常なら、"+"は%2Bにエンコードされて、%2Bをデコードして"+"に戻るはずなのに、現状では、"+"が%2Bにエンコードされずに+のまま送信され、半角スペースにデコードされてしまっていることです。
もう一つの問題は、半角スペースが"+"以外の何かにエンコードされ(未確認)、正常にデコードが実行されている理由がわからないということです。
デコードというよりはエンコードの問題な気がしてきました。
なるほど。どのようにして送信しているかわからないので、
そちらのやり方についてご提示いただければ何かわかるかもしれませんね。
現時点ではブラウザ(Chromeで試しています)に直接 "+ +" を入れるとたしかに
%2B+%2Bとエンコードされていますね。。
回答ありがとうございます。
エンコードしているとおぼしき箇所を抜き出してきました。
入力口すべてについて、@DTW_rQHTMLENCODE()が書いてあり、おそらくこれでエンコードがされています。
現在ググってますが、文献が少なそうです。
なるほど。IBMのなんか、(DB2Server?/Net.data?)くらいしか情報がなかったですね。
実際そこが回避できないのだとしたら、デコードを二重で実施するしか手がなさそうですね。
あまりお役に立てずスミマセン。
回答ありがとうございます。
DTW_rQHTMLENCODEに対応したデコードを確認してみます。
kidd-number5さんに質問している中で情報が整理されていったので助かりました。
また質問を見かけた際は、ぜひご回答よろしくお願い致します。
回答ありがとうございます。
>"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?
質問がわかりにくくてすみません。
問題は2つあります。
1つ目の問題は、通常なら、"+"は%2Bにエンコードされて、%2Bをデコードして"+"に戻るはずなのに、現状では、"+"が%2Bにエンコードされずに+のまま送信され、半角スペースにデコードされてしまっていることです。
もう一つの問題は、半角スペースが"+"以外の何かにエンコードされ(未確認)、正常にデコードが実行されている理由がわからないということです。
デコードというよりはエンコードの問題な気がしてきました。