• ベストアンサー

CGIプログラム 初歩的質問

http://xxx.ne.jp/xxx.cgi 内設定 --------------------- $word = $ENV{'QUERY_STRING'}; ページに貼ったリンク -------------------------------- <a href="http://xxx.ne.jp/xxx.cgi?http://okwave.net/" target="_blank">http://okwave.net/</a> この場合だと、$word で http://okwave.net/ とCGI側に出てきますが、 <a href="http://xxx.ne.jp/xxx.cgi?無理難題" target="_blank">無理難題</a> と、日本語に変えるとCGI側表示が文字化けします。 何か付け加える必要があるのでしょうか? 検索しますがいまいちはっきりとした答えがありません。 ご教授をよろしくお願いします。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.2

横から失礼いたします。 お礼の項目で示されている機能を間違えていらっしゃるようですのでフォローさせていただきます。 エンコード(変換する方) $word =~ s/([^\w])/'%'.unpack('H2',$1)/eg; $word =~ tr/ /+/; デコード(元に戻す方) $word =~ tr/+/ /; $word =~ s/%([a-fA-F0-9]{2})/chr(hex($1))/ge; です。 処理がデコード側になっているように見受けられます。 スペースの処理も必要ですのでお忘れのないように。

syuricyan
質問者

お礼

ちょっと勉強が足りなかったみたいです。スペース処理というのも必要なのですね。 これはちょっとお聞きしたいことなのですが、HP側のリンクをクリックした時に変換され、 CGI側で受け取ったときにそれを日本語に戻すので、「デコード」だとは思ったのですが違うのでしょうか? 現在いろいろと試してはいるのですが、特にこれといって問題ないのでこれでいいかと思ってました。 送る日本語は実際には人名がほとんどです。ご回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.4

多重投稿申し訳ありません。 書きかけで送ってしまいました。 > CGI側で受け取ったときにそれを日本語に戻すので、「デコード」だとは思ったのですが違うのでしょうか? すみません。それでOKです。わたくしの勘違いでした。 ご質問の内容がてっきり「エンコード」についてのことだとばかり思っておりました。 特にご質問のところに 「<a href="​http://xxx.ne.jp/xxx.cgi?​無理難題" target="_blank">無理難題</a>」 というのがありましたので、GETメソッドで値をエンコードするには、という質問と勘違いしておりました。 「<a href="​http://xxx.ne.jp/xxx.cgi?VALUE=%96%b3%97%9d%93%ef%91%e8" target="_blank">無理難題</a>」 こんな感じにすればいいよという解答のつもりで書いたのですが、そこから先のお話だったんですね。すいません。

syuricyan
質問者

お礼

いえいえ、よかったです。何せ知識が乏しいもので、プログラムからはどうなってるのかさえ理解できてないですし、 もともとは「エンコード」から話が始まっていて、自分で「デコード」になるのかなぁ・・と解釈したのですが、 言われると間違いかなぁとなってしまうもので・・。でもなんでちゃんと動いてるんだろう・・てな感じでした。^^ とりあえず安心しました。再度ご回答していただいたことに感謝します。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

> CGI側で受け取ったときにそれを日本語に戻すので、「デコード」だとは思ったのですが違うのでしょうか? すみません。それでOKです。わたくしの勘違いでした。

全文を見る
すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

QueryStringで渡す場合には「URLエンコード(この言葉で検索すればたくさんHitすると思います)」してから渡してください。

syuricyan
質問者

お礼

ご指導していただいた検索でいろいろと調べたところ、なんとか解決しました。 $word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/ego; これを追加して文字をチェックしていますが、今のところ問題なく変換されてます。 正直なところ、内容の意味がいまいちわかってませんが・・。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • CGIにJavascriptを書きたい。

    CGIで作った日記にJavascriptのアクセス解析をつけようと思ったのですが、 「実行しましたが、ページでエラーが発生しました。」(IE6で確認しました。)とステータスバーに表示され、 上手く働きません。どうすれば良いのでしょうか。 入れたいのは下の文です。(xは伏字です) <!--xxxxx--> <script src="http://xxxxx"></script> <noscript><a href="http://xxxx?xxxx" target="_blank"> <img src="http://xxxx?xxxx" border=0></a><br> <a style="font-size:80%" href="http://www.xxxx/" target="_blank">アクセス解析</a></noscript> <!--xxxxx-->

    • 締切済み
    • CGI
  • 初歩的かもしれませんが回り込みが上手くできません

    初歩的かもしれませんが回り込みが上手くできません イメージ的には、図のようなdivを4つ横に並べて改行、同じように繰り返したいです。 ■■■■ ■■■■ しかし、下記の様にすれば ■■■ ■ ■■■ ■ に、なってしまいます。 こういう場合、どうすればいいのでしょうか?? <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave1</a></div> <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave2</a></div> <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave3</a></div> <div class="sample" style=" width:120px; "><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave4</a></div> <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave5</a></div> <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave6</a></div> <div class="sample" style=" width:120px; float:left;"><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave7</a></div> <div class="sample" style=" width:120px; "><a href="http://okwave.jp" target="_blank"><img src="okwave.png" height="80" width="120"><br>okwave8</a></div>

    • ベストアンサー
    • CSS
  • 文字化け

    下記のようなcgiスクリプトがあり、test1.cgi から リンクの test2.cgiを呼ぶと 「リンドウ」が文字化けしてしまいます。 文字化けしないようにするには、どうしたらいいでしょうか。 Perl cgi 初心者です。 --------test1.cgi----------------------------------------- #!/usr/bin/perl print "Content-Type: text/html; charset=EUC-JP\n\n"; $name="リンドウ"; print "name=$name<br>"; print "<a href=\"test2.cgi?aaa,${name},bbb\">test2.cgi</a>\n"; ---------test2.cgi------------------------------------------------- #!/usr/bin/perl print "Content-type: text/html; charset=EUC_JP\n\n"; $query = $ENV{'QUERY_STRING'}; print "query=$query\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
  • $ENV{'QUERY_STRING'}以外で引数を取得するには?

    CGI上で$ENV{'QUERY_STRING'}を使用しないで引数を取得するにはどうしたらいいのでしょうか? hoge.cgi?XXXX の XXXX を取得したいのですがある理由によって$ENV{'QUERY_STRING'}が使用できません。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • URLについて

    たとえば、「http://xxx.xxx.xxx/card/1234」というアドレスで、1234番のカードを表示するというようなことをやりたいのですが、どうしたらよいでしょうか。 cardディレクトリにindex.cgiを置いて、$ENV{'QUERY_STRING'}で取得すればいいのかなと思ったのですが、それだと「http://xxx.xxx.xxx/card/?1234」のように数字の前に「?」を入れないと「404 - ファイルが見つかりません。」のエラーになってしまいます。できれば「?」はURLに入れたくありません。 アドバイスいただけないでしょうか。よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIでフォームデータを取得できません

    CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }

    • 締切済み
    • CGI
  • htmlからjavascript経由でのphp結果

    お世話になります。 htmlからjavascriptを介してphpを呼んでいます。 htmlでは以下のように呼んでいます。 <script type="text/javascript" src="../xxx.php" charset="utf-8"></script> html内のphpファイルをwebサーバ上で直接実行すると以下のように表示されます。 ----------------------------- document.write("<a href=http://xxx1 target=_blank>タイトル1</a><br>") document.write("<a href=http://xxx2 target=_blank>タイトル2</a><br>") document.write("<a href=http://xxx3 target=_blank>タイトル3</a><br>") document.write("<a href=http://xxx4 target=_blank>タイトル4</a><br>") ----------------------------- 出力した内容は表示できているので、phpコード的には問題ないと思うのですが htmlに出力されません。 他の箇所で同様の処理を行っていて、こちらはhtml上に表示されているので ちょっと苦戦しています。 ファイルもutf-8でbomなしにしています。 先輩方よろしくお願いします。

    • ベストアンサー
    • PHP
  • cgiの自動起動

    cgiの起動はXXX.cgiへのリンクを貼ってクリックして起動するのが普通ですが、 <a href="http://***/XXX.cgi">cgi起動</a> ページを開くと自動的にcgiを起動させることは出来ますか?(クリックなしで...) *.htmlにどのようなtagを記述すればよいのか?よろしくご教示お願いします。

    • 締切済み
    • CGI