• ベストアンサー

CGI.pmで日本語をURLエンコードするとおかしい

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

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

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

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

私の環境では、 utf8 や encoding を use してる場合に単純にはできませんね。 下記は、スクリプトを UTF-8 で書いて STDOUT のコードを Windows の SJIS にする例で、正しく動作します。 CGI.pm 3.15 は utf8フラグに対応してない模様です。 #! /usr/bin/perl -w use Encode; use utf8; use CGI; binmode(STDOUT, 'encoding(Windows-31J)'); my $esc = CGI::escape('あ'); print("$esc=", decode('utf8', CGI::unescape($esc)), "\n"); 再度質問される場合は、上の例の様に問題を確認できるなるべく短いスクリプト全体を書いて頂ければ解決が早いかも知れません。

zyousuke
質問者

お礼

zxcv0000さん、ご回答ありがとうございます。 ご紹介いただいた見本コードを参考に、なんとか日本語でもまともにURLエンコードできるようになりました。 しかし私は >CGI.pm 3.15 は utf8フラグに対応してない模様です。 とのコメントが気になり、試しにCGI.pmを最新版にしてみました。 そうしたら、Encode.pmに頼らなくても日本語のURLエンコード(デコード)ができるようになっていました!! print($q->unescape($q->escape('あ')), "\n"); このコードを実行すると'あ'と表示されるようになりました \(^o^)/

関連するQ&A

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

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

  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • CGIが動きません

    GETのbodyにbase64でエンコードされた文字列 typeにMIMEタイプ それをエンコードして出力するものです よろしくお願いします。 以下はソースコードです。 #!/usr/local/bin/perl @querystring = split (/&/,$ENV{'QUERY_STRING'}); foreach $tmp (@querystring) { ($vname,$value) = split (/=/,$tmp); $args{$vname} = &url_decode($value); } sub url_decode($) { my $url_decode_str = shift; $url_decode_str =~ tr/+/ /; $url_decode_str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; return $url_decode_str; } print "Content-type:".$args{'type'}."\n\n"; binmode (STDOUT); $out = MIME::Base64::decode_base64($args{'body'}); print $out;

    • ベストアンサー
    • 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
  • UTF8 URLエンコード

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

    • 締切済み
    • CGI
  • CGI.pmで'&'が'&amp;'に置き換わってしまう!

    文字「&」を出力したいのにCGI.pmが自動的に「&amp;」に変換してしまいます。 具体的には、 <a href="abc" accesskey="&">abc</a> のような文字列を出力させるために、 print($q->a({-href => 'abc', -accesskey => '&'}, 'abc')) というコードを実行したのですが、 出力される文字列は、 <a accesskey="&amp;" href="abc">abc</a> のように「&」が自動的に「&amp;」に置き換わってしまいます。 これの解決策として、オブジェクトを使用せずに、直接CGI.pmのメソッドを呼び出すと、なぜか変換されません。 すなわち、上のコードの「$q」の部分を「CGI」として、 print(CGI->a({-href => 'abc', -accesskey => '&'}, 'abc')) とします。 これは何か意味があるのでしょうか。それともただのバグ? 直接CGI.pmのメソッドを呼び出さなくても解決する方法はありますか。 accesskeyに関するご意見は、先日質問したこちらのスレへ頂けるとうれしいです。 http://oshiete1.goo.ne.jp/qa5707867.html

    • ベストアンサー
    • Perl
  • CGI.pmのhtmlhへの表示について教えて下さい。

    こんにちわ。CGI.pmをhtmlで表示させたいと思っているのですが、うまくいきません。どこか足りないのでしょうか。お解りの方どうか教え下さい、よろしくお願いします。 use CGI; $q=newCGI; print $q->header(-type=>'text/html',-charset=>'Shift_JIS'), $q->start_html(-lang=>'japanease'), $q->h1('こんにちわ'), $q->end_html;

    • ベストアンサー
    • Perl
  • インターネットヘッダ内の日本語のエンコード/デコード

    電子メールの件名やあて先など、日本語を使うと、 インターネットヘッダ内では、例えば以下のような ASCII文字にエンコードされていますが、 =?iso-2022-jp?Q?=1B$BEE;R%a!<%k$N7oL>?= これはどんな規則でエンコードされているのでしょうか。 つまり、メーラを使わずに手操作でデコードしたいのですが、 どのような手続きをとれば、日本語(シフトJISなど)に 変換できるのでしょうか? あるいは、フリーの変換ソフトなどがあれば、教えていただきたく 思っています。

  • perlで、日本語を含むURL(勿論、エンコード)のページ作成を考えて

    perlで、日本語を含むURL(勿論、エンコード)のページ作成を考えています。 が、ファイルの作成まではうまくいくのですが、いざ、そのURLにアクセスすると 「not found」になってしまいます。 (FTPでのぞくと、確かに、そのファイルは存在するのに、 そのURLにブラウザーからアクセスすると「not found」になってしまいます) そこで、以下の様な小さな実験をしてみました。 <実験> %A3.html という名前のファイルを手動で作り、それをFTPでアップしたところ、 FTP上では「%A3.html」ではなく、「%25A3.html」と表示されました。 そして、 http://nantoka.com/%A3.html http://nantoka.com/%25A3.html 両方にアクセスしたのですが(nantokaの部分は架空のものです)、やはり両者とも「not found」になってしまいます。 ●なぜ、この様な現象が起るのでしょうか? ●どの様にすれば、この問題は解決するのでしょうか? 教えていただければ幸いです。 ちなみに、perlの中では、以下の様な処理をしています。 ---------------------------------------- # キーワードは、UTF-8エンコードサイトから引っ張ってきます。 $keyword="キーワード"; #URLエンコード use URI::Escape; $keyword = uri_escape($keyword); $pageurl ="p/$keyword?.html"; $body ="サイトの中身"; open( FH, '>',$pageurl); print FH "$body"; close( FH ); ---------------------------------------- これで、 http://nantoka.com/p/$keyword.html (例えば、http://nantoka.com/p/%8F%AC%91%F2%88%EA%98Y.html等にアクセスした時に、 ちゃんと表示させたいのです。今現在も、FPTで見ると、当該ディレクトリーに「%8F%AC%91%F2%88%EA%98Y.html」は 存在しているのですが、ブラウザーでアクセスすると「not found」になってしまいます。

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

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

    • ベストアンサー
    • CGI

専門家に質問してみよう