• 締切済み

URLエンコードされたデータを戻すには

POSTでCGIに渡す文字列はURLエンコードされていて、元に戻すにはデコードが必要ですが、もともとURLエンコードされたデータをデコードしたデータにできないでしょうか。 普通は、 読める文字→URLエンコード→CGIによる処理→URLデコード→読める文字 ですが、 もとのデータがURLエンコードされた状態だと、 URLエンコードされた文字→URLエンコード→CGIによるURLデコード→URLエンコードされた文字 となってしまいます。 たとえば、「%82%a0%82%a0%82%a0」というデータ形式から、「あああ」というデータを得たいのです。

  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • tailkuppa
  • ベストアンサー率53% (52/98)
回答No.1

$str をエンコードされた文字列とします。 while ($str =~ /%([0-9a-fA-F][0-9a-fA-F])/g ) {  $str =~ s/\+/ /g;  $str =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg; } で、URLエンコードされていると思われる文字列(%+十六進の数字) がなくなるまで ひたすらデコードしてくれると思います。

関連するQ&A

  • utf-8の文字列に対してURLエンコードを行なうには?

    最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。

    • ベストアンサー
    • Perl
  • UTF8 URLエンコード

    こんにちわ。 PerlのCGIです。 今までEUCとsjisの変換連打で開発を乗り切って来たのですが、 さすがに古すぎて周りの人が迷惑らしいので、初めてUTF8を使うことになりました。 一応全部UTF8だけで作ろうと思います。 大まかな質問は三つです。 1:   UTF8は可変ビット (バイト単位ではない) の、   ほぼ全ての国際言語対応文字コードと言う認識で合ってますか? 2:   そうなってくると、データの送受信などのURLエンコードは不要ですか?必要ですか? 3:   もしURLエンコードが必要なら、一般に通用する変換方法を教えてください。   ついでなんでデコードの記述もお願いします。 すみませんがよろしくお願いします。

    • 締切済み
    • CGI
  • URLのエンコードについて

    JavaScriptで、JSON形式で渡ってきたデータを読んで、一部、文字列を結合して URLを作るんですが、その際のエンコードは encUrl= 'http://test.com/' + encodeURIComponent(xxx) + '/'; (xxxがjsonからきたデータ) で大丈夫でしょうか? たとえば.NETで言うところのHttpUtility.UrlEncodeと同じことがしたいのですが、 URIエンコードだとたぶん違いますよね…。 何を使えばUrlEncodeが出来るのでしょうか。

  • URLエンコードについて

    「 † 」 の文字をUTF-8 でURLエンコードした時の値が2種類あるんでしょうか。 以下の2つのURLエンコードした文字を %EF%BC%8D %E2%80%A0 URLエンコード/ デコードの結果を出力してくれる こちらのサイトと https://www.tagindex.com/tool/url.html こちらのサイト https://tech-unlimited.com/urlencode.html で結果が異なるみたいです。 なぜこういった結果が異なる状況が生まれるのでしょうか そして正しいのはどちらなのでしょうか

  • フォーム送信とURLエンコードについて

    CGI&PHP初心者です。 フォームのデータ送信とURLエンコードについて、お尋ねします。 method="GET" のフォームで、検索フォームをつくりたいとおもっています。 日本語も含めた検索語をフォーム送信したいと考えていますが、 送信の結果、エンコードされずにそのままブラウザのURL欄に入力した日本語が表示されてしまいます。 (ただ、メモ帳などにURLをコピーペーストするとURLエンコードがされているようです。) googleでは検索結果のアドレス欄にURLエンコードされた文字列がでているが、 同じように検索結果のアドレス欄にはURLエンコードされた文字列をだしたい。 URLに日本語をださずにURLエンコードさせた文字列を表示させるには、 どうすればいいのでしょうか? 補足:できるかぎり検索処理が重くならないにしたいと思います。     開発環境PHP&MySQL     動作環境Chrome のバージョン 38.0

    • ベストアンサー
    • CGI
  • CGI.pmで日本語をURLエンコードするとおかしい

    CGI.pmで日本語をURLエンコードするとおかしくなります。 print($q->unescape($q->escape('あ')), "\n"); このコードは文字'あ'をURLエンコードしたものをURLデコードして表示するはずです。 すなわち'あ'と表示するはずです。 しかし実際には'a??'と表示されてしまいます・・・ 何か他の関数をかまさないといけないのでしょうか???

    • ベストアンサー
    • Perl
  • OSとURLエンコードの関係

    メールに参照としてサイトのURLを記載することがありますが、URLをクリックしても WEBブラウザが起動しないことがよくあります。メールS/WはThunderbirdです。 例: http://www.….jp/index.php?%A5%C1%A5%A7%A5%C3%A5%AF%A5%EA%A5%B9%A5%C8 ※アドレスは編集済 質問(1) 下記の通り推測しておりますが、考えは正しいでしょうか? 考えられる要因としては、全角文字を含むアドレスをサーバがURLエンコードするとOSに 依存したアドレスが生成され、例えば、UNIXサーバでURLエンコードされたアドレスをWindowsの クライアントが開く場合、Windowsがデコードする文字コードが異なるため、正しくデコードできず、 ブラウザが起動しない。 のではないかと考えております。 質問(2) OSのURLエンコード、デコードの関係は下記で正しいでしょうか? また、質問(1)が正しいとすると、文字コード同士の互換性はないということでしょうか?  UNIX … EUC  MAC … SJIS  Windows … Unicode 質問(3) 質問(1)の解決方法はありますでしょうか? 長くなりましたが、ご教授のほどよろしくお願いいたします。

  • 携帯電話の絵文字とURLエンコード/デコードについて

    携帯電話の絵文字とURLエンコード/デコードについて Java・シェルスクリプトによるCGIとPHPを用いた 携帯電話向けのウェブアプリを開発しています。 アプリの内容としては、PHP側で生成したHTMLのフォームから ユーザーに入力してもらった文字列を引数としてJava側に渡し、 Java側で値を受け取ってから、文字列変換処理を行うものです。 この際の、携帯電話特有の絵文字の取り扱いについてつまずいています。 PHPとPHPとの間の場合は、フォームから送られるパラメータが 絵文字を含んでいたとしても、特に何の問題なく絵文字パラメータの 入力・送信(<input type="text" name="hoge" value="EMOJI">)・ 受信・表示(echo $_REQUEST['hoge']; で EMOJI を表示する)ができていたのですが、 フォームから送られるURLエンコードされたクエリー文字列を Java側で引数として受け取り、もとの文字列に戻すためにURLデコードの処理をかけると、 携帯電話で入力した絵文字の部分だけ文字化けしてしまいます。 (現在確認の取れているのは、ドコモの絵文字とauの絵文字が「 ? 」 (半角のクエスチョンマーク)に化けてしまう事態です) PHPどうしの間でフォームによってPOSTやGETで送受信される際も 入力された値がいったんURLエンコードされてから HTTPリクエストに乗ることは間違いないと思うので、 Java側のURLデコーダーの問題かと思われるのですが (たとえば、未知の範囲のバイナリはすべて例外として ? にしてしまう、など)、 どなたか解決策等をご存じないでしょうか。 ちなみに現状、絵文字以外の通常の文字列に関しては目立った問題はなく 受信、変換処理、表示等ができている段階なので、 最後の最後に絵文字の問題だけが残ってしまい、困っています。 よろしければ、ご教唆のほど、よろしくお願い申し上げます。 参考までに、開発環境は以下の通りです。 ・Windows XP SP3 + Eclipse Build id: 20100218-1602(ローカル開発環境) ・Cent OS 5.3(アプリ実行用VPSサーバー) ・Sun JDK SE: 1.6.0_20 (開発用Windowsマシン・アプリ実行用サーバともに同じバージョン) ・使用言語および文字コード  Java、PHP、日本語、Shift_JIS(携帯電話のうち、ドコモがShift_JISを標準とするため) ・URLデコーダーに使っているパッケージ・クラス  org.apache.commons.codec.net.URLCodec の decode()メソッド (Shift_JISの場合、java.net.URLDecoder は java.net.URLEncoderでエンコードしたものしか正常にデコードできないため) (参考: http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=25659&forum=12 ) ( http://commons.apache.org/codec/download_codec.cgi )

    • ベストアンサー
    • Java
  • [Perl] unpackで不要文字にエンコード

    Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0  を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • 掲示板に携帯から書き込むとURLエンコード

    PHPを使って掲示板を作成しています。 UTF-8でPHPファイルを作成し、UTF-8のテキストファイルにログをためていく感じで作っています。 PCでは、だいたい正常に動くようになったのですが、携帯電話(au/W61S)からの投稿を試してみたところ、投稿結果がURLエンコードの状態になってしまいました。。。 %82%c6%82%a4%82%b1%82%a4%82%c4%82%b7%82%c6 さらにシフトJISでエンコードされているようでしたので、自分のつたない知識を総動員して、以下のような処理をさせることでなんとか形にはなったのですが、かなり処理としては乱暴な気がしています。 携帯電話からの投稿というのは、URLエンコードとして受け取るしかないのでしょうか(auでしか試していないため、他のキャリアだと別の問題が発生するのでしょうか?) また、下記の方法よりももっとスマートに携帯からの投稿を、表示できる文字列に変換する方法をご存じの方がいらっしゃいましたら、ご教授いただければ幸いです。 よろしくお願いいたします。 <?php //フォーム内に入力された文字列を取得 $test = $_GET['formtxt']; //先頭の文字を抽出 $firsttxt = substr($test,0,1); //先頭の文字列が%であれば、URLデコードを行い、シフトJISからUTF-8に変換する if($firsttxt == "%"){ $test = urldecode($test); $test = mb_convert_encoding($test,'UTF-8','SJIS'); } ?>

    • 締切済み
    • PHP

専門家に質問してみよう