- ベストアンサー
文字化けの原因と解決方法
- 下記のcgiスクリプトでリンクが文字化けしてしまう問題が発生しています。初心者の方でも解決できる対策方法を紹介します。
- Perlのcgiスクリプトでリンクを作成する際に文字化けする問題があります。この記事では、文字化けの原因と解決方法について説明します。
- cgiスクリプトでリンクを作成する際に文字化けが発生する原因を解説し、解決方法を提案します。初心者の方でも理解しやすいように解説しています。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
こんなんで如何でしょうか? --------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";
その他の回答 (5)
- gentaro
- ベストアンサー率47% (105/221)
簡単に言うと、URLには使っちゃいけない文字コードがある、ということです。 例えば & 記号はGETで渡す場合には引数のつなぎとして使われる文字ですが、引数に&という文字を入れてしまうと、QUERY_STRINGを分解して処理する側は、どこで切ればいいのかわけがわからなくなりますよね。 となると、渡す前にこの文字を何か別の使える文字に置き換えて、受け取った側ではその文字を元に戻せばよい、と。 日本語(漢字)コードにはこのような「URLに使っちゃいけない」コードが含まれる場合があり、それが受け取った側で正しく表示できない原因となるのです。 先の「リンドウ」の場合は、「リ」と「ン」がこれに当たります。「ドウ」だけ送信すれば正しく見れますよね。 「使っちゃいけないコード」が含まれない日本語は正しく送信されるので、ここで悩んでしまうんですね。 詳しく知りたい場合は「EUC漢字コード表」を見て、「アスキーコード表」とにらめっこして下さい。 POSTの場合には受け取る処理方法が違いますから、このようなことをしなくとも問題はでません。 ですからGETで値を渡す場合は、この「エンコード」「デコード」をする、ということを頭に叩き込めばいいわけです。 そうすればどのような文字でも受け取り側に正しく送ることができます。 googleなどで URL エンコード などで検索してみてください。もっと詳しい解説がたくさんあると思いますよ。 そんで検索結果に飛ぶ前に、GETでのリンクを見てください。日本語に対して同じことやってますから。 私も昔初めてWEBプログラムをやったときは、これ知らないで、GETの引数にスペースを入れて、なぜ途中で引数がちょん切れるのか「3日間」悩んだことがありますから。 誰でも一度は通る道です(笑)
お礼
gentaro さんありがとうございました。詳細な説明まで戴き、感激しております。 ありがとうございました。
- a-saitoh
- ベストアンサー率30% (524/1722)
それって,文字化けじゃなくてエンコードされてるだけでは? ブラウザがcgi1から受け取った A href・・を処理してWEBサーバにアクセスする際に,漢字や一部の特殊文字がURL含まれているとエンコードしますが. %83%8A%83%93%83h%83E になってませんか?
- 3o-clock
- ベストアンサー率33% (233/689)
わぁごめんなさい。 まったく質問理解してなかった。
- 3o-clock
- ベストアンサー率33% (233/689)
test1.cgiを呼び出したら name=リンドウ test2.cgi っと表示されました。 test1.cgiを保存する時に、EUC-JPで保存していますか?
補足
EUC_JP はミスタイプで実際は EUC-JP です。 EUC-JP で保存しています。
- a-saitoh
- ベストアンサー率30% (524/1722)
charset=euc-jp のマイナスがアンダーラインになってます.
補足
gentaro さんありがとうございました。 教えていただいた方法でうまく行きました。 実際に作成中のCGIスクリプトに、埋め込んでもうまく行きました。 フォームで送る場合は、問題は無いのですが QUERY_STRING だと文字化けして困っていました。 文字列に、何らかの変換をして、それを受けた側で、復元しているのかと思いますが、ここでは、どういったことが行われているのでしょうか。 わかりやすく、教えていただけるとありがたいです。