- 締切済み
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)』になっていますが、 色々と設定を変更しても同様にうまく表示されません。 エンコードやデコードをよく理解していないのかもしれませんが、 どなたか私のやっている中のバグをご指摘して頂けないでしょうか。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
実際に、組み込みしてみると不具合が出るということですと もう一度、全体的なフロー(流れ)を再点検されてみるといいかもしれません。 ひとつ気になっていたのは、 ttp://abc.dom/index.cgi?query=□u□{□e... と化ける点です。 実はエンコードされてない文字が送られているとか・・ もしくは、エンコードとデコードが逆ではないか?等・・
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
うーん、このスクリプト、試してみてください。 念のため、ShiftJISコードで保存してください。 Filename:test.cgi ----- #!/usr/bin/perl print "Content-type: text/html\n\n"; if($ENV{QUERY_STRING} eq '') { $str=&encode("文字列"); print << "EOM"; <html><body> <a href="test.cgi?$str">$str</a><br> </body></html> EOM } else { $str=&decode($ENV{QUERY_STRING}); print << "EOM"; <html><body> <a href="test.cgi">$str</a><br> </body></html> EOM } sub decode { my ($s) = @_; $s =~ tr/+/ /; $s =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; return $s; } sub encode { my ($encoded) = @_; $encoded =~ s/(\W)/'%' . unpack('H2', $1)/eg; return $encoded; }
補足
ご指導ありがとうございます。 ymdaさんのスクリプトを実験しましたところ、うまくいきました。 ただ、どの部分が文字化けに影響しているのかがいまだに掴めません。 エンコードとデコードは同じように実行されているように見えるのですが・・。 どのように私のスクリプトに組み込めばよいのかを教えて頂ければ幸いに存じます。
- 春原 なの(@ymda)
- ベストアンサー率37% (668/1777)
ためしにこうしてみてください。 $str=&encode("文字列"); $str=&decode($str); sub decode { my ($s) = @_; $s =~ tr/+/ /; $s =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; return $s; } sub encode { my ($encoded) = @_; $encoded =~ s/(\W)/'%' . unpack('H2', $1)/eg; return $encoded; }
お礼
投稿ありがとうございました。 先ほど試しましたところ、残念ながら、同じ結果となりました。 コードを見るところ、エンコードとデコードをサブルーチンの中に入れた部分以外に相違点がないように思われるのですが、何か異なるポイントはあったのでしょうか。
お礼
ちなみに、test.cgiにおいては実験こそうまく行きましたが、 http://127.0.0.1/test.cgi における %95%b6%8e%9a%97%f1 にカーソルを合わせると、 http://127.0.0.1/test.cgi?□¶□□□n というような“文字化け”したものが表示されます。 しかし、この場合は、クリックしたら 文字列 が表示され、うまく行きますが・・。 とりあえず、私のブラウザでは test.htmlにおいて、 <a href="http://127.0.0.1/test.cgi?query=%93%FA%96%7B%8C%EA">日本語</a> という一行のソースを書いたとしても、 カーソルを合わせたステータスバーには 文字化けしたものが入っています。 ちなみに、私が使っているブラウザは I.E.6.0 です。 色々とご指南頂き、ありがとうございました。 そして、せっかく教えて頂いたのに、うまく文字化けを直すことが出来ず、 申し訳ありません。
補足
そうなんですよね・・。 ?query=□u□{□e... に直接 ?query=%93%FA%96%7B%8C%EA を打ち込んで試してみても、ステータスバーには ?query=□u□{□e... と表示されてしまうんです。この場合も、 実際にクリックした後のアドレスバーには ?query=%93%FA%96%7B%8C%EA と表示されるんですけどね・・。 ・・分からないことだらけです。 私にとっては。