perlに関する質問です。

perlにおけるhttpリクエスト時のエンコードとデコードにおける下記の問題について、教えてください。

*問題点
コメント欄のコードでデコード処理をしています。
このままだと、ブラウザ側で'+'の文字列を含めたリクエストを送ると、サーバー側でリクエストを処理する際に、'+'が半角スペースに置換されてしまいます。(期待している挙動:'+'は別の文字コードにエンコードされ、 $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;の処理でデコードされる)

$value =~ tr/+/ /;の処理をコメントアウトすると、'+'が半角スペースに置換される問題が解消されます。また、半角スペースのデコードがされないはずなのに、半角スペースが正常に処理され、全く問題がないように見えます。
これは、下記の私の認識と食い違います。どなたかご存知の方がいらっしゃいましたら、解説をお願い致します。

*現状の私の認識
urlにリクエストを投げるときの半角スペースは+にエンコードされるため、
サーバー側(perl側)で+を半角スペースにデコードしなければならない。

よろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2011/07/03 13:35:12
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:kidd-number5 No.1

回答回数117ベストアンサー獲得回数15

ポイント68pt

"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?

だとしたら、 + は %2Bとして送るべきです。

この辺でしょうか。

http://d.hatena.ne.jp/koyuking248/20101129/1291034025

あと、URI::escapeというモジュールもありますね。

http://search.cpan.org/dist/URI/URI/Escape.pm

id:puriketu99

回答ありがとうございます。

>"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?

質問がわかりにくくてすみません。

問題は2つあります。

1つ目の問題は、通常なら、"+"は%2Bにエンコードされて、%2Bをデコードして"+"に戻るはずなのに、現状では、"+"が%2Bにエンコードされずに+のまま送信され、半角スペースにデコードされてしまっていることです。

もう一つの問題は、半角スペースが"+"以外の何かにエンコードされ(未確認)、正常にデコードが実行されている理由がわからないということです。

デコードというよりはエンコードの問題な気がしてきました。

2011/06/30 12:21:32

その他の回答4件)

id:kidd-number5 No.1

回答回数117ベストアンサー獲得回数15ここでベストアンサー

ポイント68pt

"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?

だとしたら、 + は %2Bとして送るべきです。

この辺でしょうか。

http://d.hatena.ne.jp/koyuking248/20101129/1291034025

あと、URI::escapeというモジュールもありますね。

http://search.cpan.org/dist/URI/URI/Escape.pm

id:puriketu99

回答ありがとうございます。

>"+" の文字列を送信しているのに、それがスペースを送信していると解釈されているという意味でしょうか?

質問がわかりにくくてすみません。

問題は2つあります。

1つ目の問題は、通常なら、"+"は%2Bにエンコードされて、%2Bをデコードして"+"に戻るはずなのに、現状では、"+"が%2Bにエンコードされずに+のまま送信され、半角スペースにデコードされてしまっていることです。

もう一つの問題は、半角スペースが"+"以外の何かにエンコードされ(未確認)、正常にデコードが実行されている理由がわからないということです。

デコードというよりはエンコードの問題な気がしてきました。

2011/06/30 12:21:32
id:kidd-number5 No.2

回答回数117ベストアンサー獲得回数15

ポイント66pt

なるほど。どのようにして送信しているかわからないので、

そちらのやり方についてご提示いただければ何かわかるかもしれませんね。

現時点ではブラウザ(Chromeで試しています)に直接 "+ +" を入れるとたしかに

%2B+%2Bとエンコードされていますね。。

id:puriketu99

回答ありがとうございます。

エンコードしているとおぼしき箇所を抜き出してきました。

入力口すべてについて、@DTW_rQHTMLENCODE()が書いてあり、おそらくこれでエンコードがされています。

現在ググってますが、文献が少なそうです。

2011/06/30 17:40:43
id:kidd-number5 No.3

回答回数117ベストアンサー獲得回数15

ポイント66pt

なるほど。IBMのなんか、(DB2Server?/Net.data?)くらいしか情報がなかったですね。

実際そこが回避できないのだとしたら、デコードを二重で実施するしか手がなさそうですね。

あまりお役に立てずスミマセン。

id:puriketu99

回答ありがとうございます。

DTW_rQHTMLENCODEに対応したデコードを確認してみます。

kidd-number5さんに質問している中で情報が整理されていったので助かりました。

また質問を見かけた際は、ぜひご回答よろしくお願い致します。

2011/06/30 23:35:59
id:kIUOk No.4

回答回数12ベストアンサー獲得回数0

わからない

id:kIUOk No.5

回答回数12ベストアンサー獲得回数0

わからん

  • id:puriketu99
    $in_params=$ARGV[0];
    @pairs = split( /&/,$in_params);

    foreach $pair (@pairs){
    ($tag, $value) = split(/=/,$pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    (中略)
    }
  • id:puriketu99
    師匠募集中!

    現存する師匠達:http://twitter.com/#!/puriketu99/prk2master

    下記に関する私の人力検索上の質問をTwitterのリプライで通知しようと思っています。
    通知されることに差し支えがなければ、あなたのTwitterアカウントを教えてください。
    得意分野や何か一言ありましたら、書き添えてご連絡頂けると幸いです
    (連絡手段は、twitter、この質問の回答、コメントでお願い致します)

    ・Google App Engine for python
    ・Ruby on Rails
    ・jQuery
    ・JavaScript
    ・Mercurial
    ・Git
    ・Mac
    ・Heroku
    ・PhoneGap
    ・Facebook Connect
    ・その他周辺事項

    補足
    ・全てに精通している必要はありません
    ・もし、途中で通知がご面倒になった場合は、一言おっしゃっていただければ通知をしないようにします
    ・気が向いたときに回答していただければ充分です
    ・開発をしているときは高い頻度で質問することがあります
    ・初歩的な質問が多いです(http://q.hatena.ne.jp/puriketu99/questionlist)
    ・なるべく、答えを知っている人であればすぐに答えられるような質問をするようにしています
    ・私のTwitterアカウント(http://twitter.com/#!/puriketu99)
    ・熟練のプログラマーの方だと嬉しいです
    ・何か不明点があれば、Twitterやコメント欄でお問い合わせください
  • id:TransFreeBSD
    ちなみに、スペースがまともにでコードされるエンコードなら"%20"だと思いますよ。
  • id:kIUOk
    亜意鵜獲御 2011/07/04 07:17:16
    ネットの使い方もわからずに回答してしまい、申し訳ありませんでした。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません