[Perl] unpackで不要文字にエンコード

このQ&Aのポイント
  • Perl CGIについて、文字列をエンコードする方法についての質問です。
  • $val1は正しくエンコードされ、デコードも元の文字に戻った一方、$val2のエンコード文字に不要な'25'が含まれてしまいました。
  • 不要な'25'が含まれる原因や、unpackの文に問題があるのかどうかについて教えてください。
回答を見る
  • ベストアンサー

[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
  • 回答数2
  • ありがとう数1

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

> 重にエンコードというと$val1でunpackした結果が要因したのでしょうか? ちがいます。 多分euc-jpを使っていると思いますが、それだと “ガム”は A5 AC A5 E0 ですよね。 で、これを質問にあるエンコーディングで変換すると %A5%AC%A5%E0  となります(期待している結果でもありますが)。 ここで、さらにこれに対して同じ処理を加えると %25A5%25AC%25A5%25E0 になりますので、「二重にエンコーディングをかけていないか?」 と書いたのです。 #% は %25 に変換され、その他はそのままになります ということなので > デコードすると文字として「%%A5%AC%A5% E0」が表示され、本来の「ガム」が ここでデコードしているつもりでもう一回エンコードしているんじゃないでしょうか? 変換しないでそのまま出すとどうなりますか?

goofy194
質問者

お礼

変換しないでやったら、問題なく表示されました。 ありがとうございました。

goofy194
質問者

補足

返信が遅くなってしまい申し訳ございません。二重エンコード、思い当たる 節があるので、ちょっと直してみます。 その結果、またお知らせしたいと思います。 アドバイス、大変感謝いたします。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

$val1と$val2は両方とも同じ“ガム”が入ってますか? > 結果は %25A5%25AC%25A5%25E0 をみると、二重にエンコードしているように見えるんですが。

goofy194
質問者

補足

早速の回答ありがとうございます。 $val1には「おやつ」が入り、$val2には「ガム」を入力しようとしました。 $val1の価は問題なく入ったのですが、$val2には上記のような結果となり、 デコードすると文字として「%%A5%AC%A5%E0」が表示され、本来の「ガム」が 表示できませんでした。 2重にエンコードというと$val1でunpackした結果が要因したのでしょうか? 大変助かります。ありがとうございます。

関連するQ&A

  • エンコードについて

    「タイトル」というテキストを 下記のコードでエンコードすると、 # 検索用エンコード $encode = $code; $encode =~ s/(\W)/'%' . unpack("H2", $1)/eg; $encode =~ tr/ /+/; %83%5e%83C%83g%83%8b となりますが、 %E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB のようにしたいのです。 上記の検索用エンコードをどのように書き換えればできるでしょうか。 似たような記事もありましたが、明確な答えがありませんでした。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • AppleScript(or Perl)でURLエンコードするには?

    AppleScriptでURLエンコードするにはどのようにすれば良いのでしょう? Perlを使えばできそうなのですがうまくいきません。例えば”あ”をエンコードしようとして、do shell scriptコマンドから echo 'あ' | perl -pe '~s/([^?w ])/"%".unpack("H2", $1)/eg;' としても"%a4%a2"が正しいのですが、"%e3%81%82%0a"が返ってきます。 暗ーいトンネルに入ったような状態です。どなたかお力をお借りできないでしょうか?

  • URLデコードした文字列からURLエンコード

    よろしくおねがいします。 質問掲示板の中にある検索で質問掲示板の中身を検索した時に、同時にGoogleでも検索しようとおもっています 初めにフォームから得られたクエリーをデコードして &jcode'convert(*val, 'sjis'); に変換しました。 これで得た文字列で質問掲示板の中身を検索します。 つぎに、この文字列をエンコードしてGoogleに渡そうと思いましたが、ここでつまずいてしまいました。 &jcode'convert(*sarchword,'euc','sjis'); #---------- $sarchword =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $sarchword =~ s/(\W)/'%'.unpack("H2", $1)/ego; #---------- #↑このどちらかを行ってから $sarchword =~ tr/ /+/; これでできると検索して出てきたのですが、それでも正しい結果を得ることができず、文字コードの変換も'euc'を'sjis'等といろいろ変換してみてもできずに困っています。エンコードした結果の文字コードがまったく別のコードになってしまうみたいなのです。 たとえば「あいうえお」と検索したときに、上の方法でエンコードすると「%a4%a2%a4%a4%a4%a6%a4%a8%a4%aa」という値になります。 正しい結果を得る方法を教えていただけないでしょうか。 意味がわかりませんでしたら、再度説明いたしますのでよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字列は大文字のまま、UTF-8エンコードの英字だけ小文字にしたい

    下記の方法でUTF-8エンコードをしたときに、 コードの英字が大文字になってしまい困っています。 use Encode; $str = "HOGEホゲ" $str =~ s/(\W)/'%' . unpack("H2", $1)/eg; print "$str"; 現状のエンコード後)HOGE%E3%83%9B%E3%82%B2 希望のエンコード後)HOGE%e3%83%9b%e3%82%b2 半角英数字(HOGE)は大文字のままで、 エンコードだけを小文字で書き出す簡単な方法はありますでしょうか。 (小文字でないと受け付けてくれないサイトに飛ばしたいため) 現状は正規表現でAからZまで26行繰り返しています。 $str =~s/\%([A-Z0-9]{1})?A/%$1a/g; ~ $str =~s/\%([A-Z0-9]{1})?Z/%$1z/g; よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコ

    Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。 "あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら $a = "あ"; $a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg; $a =~ s/%20/+/g; print $a; という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。 今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。

    • ベストアンサー
    • CGI
  • クッキー読み込むと漢字文字列が文字化け、対策は?

    クッキーに漢字文字列 $c_inputwords を書き込んだ場合、cookie ファイルには正しく書き込まれているのですが、読み込むと文字化けしてしまいます。 エンコード、デコードしてもうまく行きません。やり方がたぶん間違っているのだと思いますので、どなたか正しい書き方・読み方を教えて下さい。 本にはApache2 とWin の間だけで発生するトラブル、と書かれていました。 ##### クッキー読み込み ########## @pairs = split(/\;/,$ENV{'HTTP_COOKIE'}); foreach $pair(@pairs) { ($cname, $hisITEMs, $fSizeData, $stichwort, $dic_current, $mojiZOOM, $c_inputwords ) = split(/\=/,$pair); $cname =~ s/ //g; $fSizeData =~ s/ //g; $dic_current =~ s/ //g; $c_inputwords =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; ## デコード } ####### クッキー書き込み準備 ########## $c_inputwords =~ s/(\w)/sprintf("%%%02X", unpack("C", $1))/eg; ## エンコード $c_line = $hisITEMs . "\=" . $fSizeData . "\=" . $stichwort . "\=" . $dic_current . "\=" . $mojiZOOM . "\=". $c_inputwords; $c_line = "KDIC=$c_line\; expires=Wednesday, 1-Jan-2020 00:00:00 GMT"; ###################################### print <<EOD; Content-type: text/html; charset=sjis-jp; Set-Cookie: $c_line <HTML><HEAD> --- --- EOD

    • ベストアンサー
    • Perl
  • 日本語でクッキーを読み書きしたいんですが。

    初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説HPでは、 >CGI(Perl)でエンコードするには次のようにします。 >$xx =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; >CGI(Perl)でデコードするには次のようにします。 >$xx =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg; と、書いてあるのですが、どこを書き換えればいいのでしょうか。ぜひご伝授をお願いします。 なお、只今改造中のソースは以下のURL掲載に掲載されております。 http://softplaza.biglobe.ne.jp/text/cgi/cgi13/cgi13-4.html

    • 締切済み
    • CGI
  • CGI文字コードの設定

     CGIにて、日本語の文字列を送信して、次のページでそれを表示する ということを試みています。例えば、 "page A"からリンクで"page B"に飛ぶとします。 --- page A (HTML)--- <a href="http://abc.dom/index.cgi?query=$string">Link</a> そのとき、"page B"の題名を"page A"のリンクの中から取り出すとします。 --- page B (HTML)--- <h1>$string</h1>  そこで、$stringに日本語を入れて送信したいのですが、 送信する前に、エンコードして、 --- page A (CGI)--- $string = "日本語"; # 例えば $string =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; print "<a href=\"abc.dom?query=$string\">Link</a>"; 受信した後、デコードして、 --- page B (CGI)--- $string =~ tr/+/ /; $string =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; print "<h1>$string</h1>"; のようにしているのですが、うまく表示してくれません。  カーソルを"Link"に合わせると、ステータスバーには http://abc.dom/index.cgi?query=□u□{□e... このような文字化け?したものが表示されます。(...は続くという意味です。) しかし、アドレスバーには http://abc.dom/index.cgi?query=%93%FA%96%7B%8C%EA と表示され、エンコードがなされていることが分かります。  実際に、クリックしてリンク先を見てみると、 $BF|K\8l (B というようなわけの分からない文字列が表示されます。 ブラウザ表示は『日本語(Shift-JIS)』になっていますが、 色々と設定を変更しても同様にうまく表示されません。  エンコードやデコードをよく理解していないのかもしれませんが、 どなたか私のやっている中のバグをご指摘して頂けないでしょうか。

    • 締切済み
    • CGI
  • 日本語のエンコード

    日本語 秘華をPHPでエンコードすると $fname = "秘華"; $name = rawurlencode( $fname ); %94%E9%89%D8 になり Perlで 秘華をPHPでエンコードすると $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; %20%94%E9%89%D8 になります PHPエンコードを%20%94%E9%89%D8 になるにはどのようにすべきですか よろしくお願いします。

    • ベストアンサー
    • PHP
  • 一般的な方法で『URLエンコード』ができません・・・

    よろしくお願いいたします。 テキストボックスに入力(「こんにちは」など)した値をもとに、Yahooで検索させたいのですが、以下の方法でエンコードしました。 sub url_encode($) { my $str = shift; $str =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $str =~ tr/ /+/; return $str; } そうしたところ、「/」や「:」も別の文字「%2f」「%3a」に変換されてしまい、Yahooのページが開きません。 ちなみにYahooで「こんにちは」と検索すると、URLが以下のようになります。 http://search.yahoo.co.jp/search?p=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF&ei=UTF-8&fr=top_v2&x=wrt&meta=vc%3D テキストボックスに「こんにちは」と入力すして検索ボタンをクリックすると、上記のように変換させたいのです。 どのようにしてエンコードしたらよろしいのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl