データをCGIに渡す形式に変換する方法

このQ&Aのポイント
  • データをCGIに渡す形式に変換する方法とは何か?
  • CGIにマルチバイト文字を渡す場合の処理方法は?
  • 元の文字列を%([a-fA-F0-9][a-fA-F0-9])に変換する方法は?
回答を見る
  • ベストアンサー

データをCGIに渡す形式に変換する。

中に入れ子で別のCGIが入っているCGIを考えました。 <iframe ・・・ action="入れ子.cgi?data1=なんたら&data2=かんたら"></iframe> みたいな感じです。 data1とdata2は親のCGIで考えて入れ子のCGIに渡します。 ところでCGIにマルチバイト文字を渡す場合は、何らかの処理をして  %([a-fA-F0-9][a-fA-F0-9]) の形式に変換されます。 これを元に戻す方法が  =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; であることは分かったのですが、ならば元の文字列を  %([a-fA-F0-9][a-fA-F0-9]) に変換する方法が  =~s/[^a-fA-F0-9]/unpack("H2", $1)/g; かと思いきや、うまく動きません。 どのように式を書けばいいのでしょうか? #! usr/bin/perl -d use utf8; binmode(STDOUT,'utf8'); our %in=(textfield=>'テスト',submit=>'送信'); foreach(keys %in) { my $unpack=$in{$_}; my $unpack=~s/[^a-fA-F0-9]/unpack("H2", $1)/g; my $pack=$unpack; $pack=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; print "$_ &nbsp; $in{$_} &nbsp; $unpack &nbsp; $pack <br>\n"; }

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

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

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答No.1

普通、CGIパラメーター中の文字の処理はブラウザがやってくれるのですが、ブラウザを介さずに直に子のCGIを起動するという事ですか? > =~s/[^a-fA-F0-9]/unpack("H2", $1)/g; > かと思いきや、うまく動きません。 [^a-fA-F0-9] では無く、生でURLに入れない文字の検出式を書きます。 ちょっとだけ面倒なので、 CGI::escape() を使った方が良いと思います。 # ASCII文字中にも、生でURLに入れてはいけない文字があります。 CGI.pm は、utf8フラグに対応したバージョンを使いましょう。

makoji
質問者

お礼

ありがとうございます。 うまく子のCGIでデータを渡すことが出来ました。 #! usr/bin/perl -d use utf8; use CGI; use Encode; binmode(STDOUT,'utf8'); our $q=new CGI; our %in=(textfield=>'テスト',submit=>'送信'); #画面表示 print $q->header(-charset=>'utf8'), $q->start_html(-charset=>'utf8', -lang=>'ja-JP'); foreach(keys %in) {#キーとデータを表示 my $unpack=&CGI::escape($in{$_}); my $pack=$unpack; $pack=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; my $decoded=&Encode::decode('utf8',$pack); print "$_ &nbsp; $in{$_} &nbsp; $unpack &nbsp; $pack &nbsp; $decoded <br>\n"; } print $q->end_html;

関連するQ&A

  • 日本語でクッキーを読み書きしたいんですが。

    初心者用の文献読むのですが、クッキーはカウンターの説明ばかりで、日本語を扱えません。 また、クッキーの解説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に下のように渡した場合、 これを受け取る側のcgiではどのように記述すればよいのでしょうか? http://cgi.example.com/cgi-bin/aaa.cgi?option=cgi.txt Perlの絵本を参考にして記述してもうまく受け取れません。 $str =~ tr/+/ /; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; 絵本をよく読むと、"*"、"-"、"."、"@"、"_"以外は、 "%"と2桁の16進数にエンコードされるとあります。 文脈どおりだと"."はそのままで良さそうに思えます。 でも実際やってみるとうまく処理できてないようです。 前出のコードの後ろは、パラメータを区切って=でキーと値を分割して、 それぞれキーと値として変数に格納しているだけです。 記号があると、 最終的には$input{'option'}=cgi.txtとして、 cgi.txtという文字列を取り出せるようにしたいです。

    • ベストアンサー
    • Perl
  • perl cgiで正規表現が無限にマッチする

    perl でcgiを作っています。フォームから受け取ったテキストから、正規表現を用いて、データを切り出そうと思っています。 以下のようなコードを書くと、マッチするのは一か所だけのはずなのに、無限回数マッチしてprintしつづけます。なにが間違っているのでしょうか。ご指導ください。 my $text = $in_data{'data_text'}; #フォームから受け取る $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; # invalidation $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; while ( $text =~ /Line(\d{1}):長さ:(\S+) km/){ print "Line$1: $2<br>"; }

    • ベストアンサー
    • Perl
  • UTF-8から送信されたデータを日本語化するには?

    %E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A これを あいうえお に変換するには、どのようにデコードすればいいのでしょうか? ご教授お願いします。m(_ _)m [現在のソース] $buffer = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$buffer); foreach $pair (@pairs){ ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; my $value = Jcode::convert($value, 'utf8'); $FORM{$name} = $value; } ↓ 「縺ゅ>縺・∴縺・」が検出されます。

    • ベストアンサー
    • Perl
  • 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
  • FLASHとCGIでのデータの受け渡しについて

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=602714 でも質問をしたのですが、 FLASHとCGIのデータ受け渡しについて質問です。 FLASH側でテキスト入力したものをCGIで受信して表示を、と思ってるのですが、 イマイチうまくいきません。 FLASHのcgi実行ボタンのアクションスクリプトは on(press){ this.getURL("http://***/test.cgi","NAKA","POST"); } test.cgiの中身は read(STDIN,$buffer,$ENV{'content_length'}); ($title,$value)=split(/=/,$buffer); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; print "Content-type:text/html\n\n"; print "<FONT COLOR=RED>文字列</FONT><BR>\n"; print "$buffer<BR>\n"; なんてしてみましたが、「文字列」だけきちんと表示されて後は文字化けしてます。 (変換がうまくいってないのかな?) このデータの受け渡しはあってるのでしょうか?間違ってるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • 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
  • CGIで受け取った日本語文字列を正規表現で

    perlでcgiを作っています。 テキストボックスに入れてもらった文字列から正規表現で数字を抽出します。 以下のように、組むと "USA"のような半角英数はただしくマッチしますが、 "アメリカ"や"ドル"などはマッチしません。簡単に解決する方法をお教えください。 my $text = $in_data{'data_text'}; $text =~ tr/+/ /; $text =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $text =~ s/[<>"'&\r\n]//g; $text =~ s/&/&amp;/g; $text =~ s/</&lt;/g; $text =~ s/>/&gt;/g; $text =~ s/"/&quot;/g; $text =~ s/'/'/g; $text =~ s/\r\n/<br>/g; $text =~ s/\n/<br>/g; $text =~ s/\r/<br>/g; if ($text =~ /USA (\d+) dollars/){ print "USA $1\n"; } if ($text =~ /アメリカ (\d+\.\d+) ドル/){ print "アメリカ $1\n"; } exit;

    • ベストアンサー
    • Perl
  • 半角スペースが有効にならない。

    前のページで入力された値を取得するCGIですが、どうしても半角スペースを認識しません。 それどころか、半角スペースの後ろを一切消してデータを取得しています。 同じように作成したものはきちんと動いているのに…。 どこが間違ってるかご指摘お願いします。 ---------- #!/usr/local/bin/perl read(STDIN,$buffer,$ENV{'content_length'}); @atai = split(/&/,$buffer); foreach $atais(@atai){ ($key, $value) = split(/=/, $atais); $FORM{$key}=$value; } $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $buffer =~ tr/+/ /; $value =~ tr/+/ /; $key =~ tr/+/ /; print "Content-type:text/html\n\n"; print "$key<BR>\n"; print "<A HREF=./***.cgi>Back</A><BR>\n"; open (FH,">***.log"); @filew="$buffer\n"; print FH @filew; close(FH); exit; ---------- 以上です。よろしくお願いします。

    • ベストアンサー
    • CGI
  • フォームデコード

    よく見かける $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; というやつの pack("C", hex($1)) を chr($1) にした方がいい と思ったんだけど、chr($1) のソースは見たことがないです。 chr($1) にするとうまくいかない場合があったりするんですか?

    • ベストアンサー
    • CGI