• ベストアンサー
  • すぐに回答を!

文字化け

  • 質問No.2027301
  • 閲覧数392
  • ありがとう数1
  • 気になる数0
  • 回答数6
  • コメント数0

お礼率 25% (5/20)

下記のような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";

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

  • 回答No.5
  • ベストアンサー

ベストアンサー率 47% (105/221)

こんなんで如何でしょうか?


--------test1.cgi-----------------------------------------
#!/usr/bin/perl
print "Content-Type: text/html; charset=EUC-JP\n\n";
$name="リンドウ";
print "name=$name<br>";

$name =~ s/([^\w ])/'%'.unpack('H2', $1)/eg;
$name =~ tr/ /+/;

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'};

$query =~ tr/+/ /;
$query =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;

print "query=$query\n";
補足コメント
ni7973

お礼率 25% (5/20)

gentaro さんありがとうございました。
教えていただいた方法でうまく行きました。
実際に作成中のCGIスクリプトに、埋め込んでもうまく行きました。
フォームで送る場合は、問題は無いのですが QUERY_STRING だと文字化けして困っていました。

文字列に、何らかの変換をして、それを受けた側で、復元しているのかと思いますが、ここでは、どういったことが行われているのでしょうか。
わかりやすく、教えていただけるとありがたいです。
投稿日時:2006/03/14 17:26

その他の回答 (全5件)

  • 回答No.6

ベストアンサー率 47% (105/221)

簡単に言うと、URLには使っちゃいけない文字コードがある、ということです。

例えば & 記号はGETで渡す場合には引数のつなぎとして使われる文字ですが、引数に&という文字を入れてしまうと、QUERY_STRINGを分解して処理する側は、どこで切ればいいのかわけがわからなくなりますよね。

となると、渡す前にこの文字を何か別の使える文字に置き換えて、受け取った側ではその文字を元に戻せばよい、と。

日本語(漢字)コードにはこのような「URLに使っちゃいけない」コードが含まれる場合があり、それが受け取った側で正しく表示できない原因となるのです。

先の「リンドウ」の場合は、「リ」と「ン」がこれに当たります。「ドウ」だけ送信すれば正しく見れますよね。

「使っちゃいけないコード」が含まれない日本語は正しく送信されるので、ここで悩んでしまうんですね。

詳しく知りたい場合は「EUC漢字コード表」を見て、「アスキーコード表」とにらめっこして下さい。

POSTの場合には受け取る処理方法が違いますから、このようなことをしなくとも問題はでません。

ですからGETで値を渡す場合は、この「エンコード」「デコード」をする、ということを頭に叩き込めばいいわけです。
そうすればどのような文字でも受け取り側に正しく送ることができます。

googleなどで URL エンコード
などで検索してみてください。もっと詳しい解説がたくさんあると思いますよ。

そんで検索結果に飛ぶ前に、GETでのリンクを見てください。日本語に対して同じことやってますから。

私も昔初めてWEBプログラムをやったときは、これ知らないで、GETの引数にスペースを入れて、なぜ途中で引数がちょん切れるのか「3日間」悩んだことがありますから。
誰でも一度は通る道です(笑)
お礼コメント
ni7973

お礼率 25% (5/20)

gentaro さんありがとうございました。詳細な説明まで戴き、感激しております。
ありがとうございました。
投稿日時:2006/03/14 23:19
  • 回答No.4

ベストアンサー率 30% (524/1722)

それって,文字化けじゃなくてエンコードされてるだけでは?
ブラウザがcgi1から受け取った A href・・を処理してWEBサーバにアクセスする際に,漢字や一部の特殊文字がURL含まれているとエンコードしますが.

%83%8A%83%93%83h%83E

になってませんか?
  • 回答No.3

ベストアンサー率 33% (233/689)

わぁごめんなさい。
まったく質問理解してなかった。
  • 回答No.2

ベストアンサー率 33% (233/689)

test1.cgiを呼び出したら

name=リンドウ
test2.cgi

っと表示されました。

test1.cgiを保存する時に、EUC-JPで保存していますか?
補足コメント
ni7973

お礼率 25% (5/20)

EUC_JP はミスタイプで実際は EUC-JP です。
EUC-JP で保存しています。
投稿日時:2006/03/13 23:12
  • 回答No.1

ベストアンサー率 30% (524/1722)

charset=euc-jp
のマイナスがアンダーラインになってます.
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ