文字化けの原因と解決方法

このQ&Aのポイント
  • 下記のcgiスクリプトでリンクが文字化けしてしまう問題が発生しています。初心者の方でも解決できる対策方法を紹介します。
  • Perlのcgiスクリプトでリンクを作成する際に文字化けする問題があります。この記事では、文字化けの原因と解決方法について説明します。
  • cgiスクリプトでリンクを作成する際に文字化けが発生する原因を解説し、解決方法を提案します。初心者の方でも理解しやすいように解説しています。
回答を見る
  • ベストアンサー

文字化け

下記のような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
  • 回答数6
  • ありがとう数1

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

  • ベストアンサー
  • gentaro
  • ベストアンサー率47% (105/221)
回答No.5

こんなんで如何でしょうか? --------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
質問者

補足

gentaro さんありがとうございました。 教えていただいた方法でうまく行きました。 実際に作成中のCGIスクリプトに、埋め込んでもうまく行きました。 フォームで送る場合は、問題は無いのですが QUERY_STRING だと文字化けして困っていました。 文字列に、何らかの変換をして、それを受けた側で、復元しているのかと思いますが、ここでは、どういったことが行われているのでしょうか。 わかりやすく、教えていただけるとありがたいです。

その他の回答 (5)

  • gentaro
  • ベストアンサー率47% (105/221)
回答No.6

簡単に言うと、URLには使っちゃいけない文字コードがある、ということです。 例えば & 記号はGETで渡す場合には引数のつなぎとして使われる文字ですが、引数に&という文字を入れてしまうと、QUERY_STRINGを分解して処理する側は、どこで切ればいいのかわけがわからなくなりますよね。 となると、渡す前にこの文字を何か別の使える文字に置き換えて、受け取った側ではその文字を元に戻せばよい、と。 日本語(漢字)コードにはこのような「URLに使っちゃいけない」コードが含まれる場合があり、それが受け取った側で正しく表示できない原因となるのです。 先の「リンドウ」の場合は、「リ」と「ン」がこれに当たります。「ドウ」だけ送信すれば正しく見れますよね。 「使っちゃいけないコード」が含まれない日本語は正しく送信されるので、ここで悩んでしまうんですね。 詳しく知りたい場合は「EUC漢字コード表」を見て、「アスキーコード表」とにらめっこして下さい。 POSTの場合には受け取る処理方法が違いますから、このようなことをしなくとも問題はでません。 ですからGETで値を渡す場合は、この「エンコード」「デコード」をする、ということを頭に叩き込めばいいわけです。 そうすればどのような文字でも受け取り側に正しく送ることができます。 googleなどで URL エンコード などで検索してみてください。もっと詳しい解説がたくさんあると思いますよ。 そんで検索結果に飛ぶ前に、GETでのリンクを見てください。日本語に対して同じことやってますから。 私も昔初めてWEBプログラムをやったときは、これ知らないで、GETの引数にスペースを入れて、なぜ途中で引数がちょん切れるのか「3日間」悩んだことがありますから。 誰でも一度は通る道です(笑)

ni7973
質問者

お礼

gentaro さんありがとうございました。詳細な説明まで戴き、感激しております。 ありがとうございました。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.4

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

  • 3o-clock
  • ベストアンサー率33% (233/689)
回答No.3

わぁごめんなさい。 まったく質問理解してなかった。

  • 3o-clock
  • ベストアンサー率33% (233/689)
回答No.2

test1.cgiを呼び出したら name=リンドウ test2.cgi っと表示されました。 test1.cgiを保存する時に、EUC-JPで保存していますか?

ni7973
質問者

補足

EUC_JP はミスタイプで実際は EUC-JP です。 EUC-JP で保存しています。

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

charset=euc-jp のマイナスがアンダーラインになってます.

関連するQ&A

  • TXTに出力すると文字化けが起こる

    Ajaxで送信したデータを元にCGI(Perl)でTXTファイルを書き換えると、 どうしても文字化けしてしまいます。 内容はこんな感じです。無駄な部分は省きました ************************* #!/usr/local/bin/perl print "Content-type: text/html; charset=Shift_JIS\n\n"; use CGI; $n = $q->param("name"); $data = "$nさん、こんにちは"; open(F,"> data.txt"); flock(F,2); print F $data; flock(F,8); close(F); end; ************************* $n(フォームのデータ)は文字化けしないのですが、 「さん、こんにちは」の部分が文字化けしてしまいます。 詳しい方、ご教授願います。

    • 締切済み
    • CGI
  • CGIにおいて、エンコード・文字化けの対処方法

    以下のようにCGIを記述しております。(本日勉強したてで間違いだらけでしたら申し訳ございません。) ============= #!/usr/local/bin/perl print "Content-type: text/html; charset=EUC-JP\n"; print "\n"; print "<html>\n"; print "<title>Hello CGI</title>\n"; print "<body>\n"; print "<h1>Hello CGI!</h1>\n"; print "<hr>\n"; print qq( 上記のCGIファイルのメッセージは、次のように記述しました。<br><br> #!/usr/local/bin/perl<br><br> print "Content-type: text/html\\n";<br> print "\\n";<br> print "&lt;html&gt;\\n";<br> print "&lt;title&gt;Hello CGI&lt;/title&gt;\\n";<br> print "&lt;body&gt;\\n";<br> print "&lt;h1&gt;Hello CGI!&lt;/h1&gt;\\n";<br> print "&lt;/body&gt;";<br> print "&lt;/html&gt;";<br><br> ); print "</body>"; print "</html>"; =========== 以上をIE7で表示しますと、エンコードが西ヨーロッパ言語になって文字化けを起こしてしまいます。 何か記述の仕方が間違っているのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 文字コードEUCのPerlプログラムが文字化けしてしまいます

    Perlで書かれたCGIを実行しようとしているのですが、プログラムはEUCで記述されているそうです。nkf -g ***とするとEUC-JPとなります。 print " <META http-equiv=\"Content-Type\" content=\"text/html; charset=EUC-JP\">\n"; とも記述されているのですが、ブラウザで実行(閲覧)すると文字化けして、ブラウザのエンコードは、Unicode(UTF-8)になっています。 ちなみに、OSはCentOS5.2です。 どうやったら、EUCで記述されたCGIが文字化けせずに実行できるのでしょうか? teratermでサーバに接続語、viコマンドで表示しても文字化けしています。ファイルの文字コードをEUCからUTF-8にして(nkf -w ***)、ブラウザでアクセスしても文字化けしてしまいます。

    • ベストアンサー
    • Perl
  • CGIが文字化けしてしまう。(Perl)

    環境 WinXP    Apache ActivePerl 開くソフトは「Tera pad」      でやっています。ソースは #!/usr/local/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>CGI TEST</TITLE></HEAD>\n"; print "<BODY>ああああ。</BODY>\n"; print "</HTML>\n"; __END__ です。「ああああ」部分が「‚ ‚ ‚ ‚ B」 と表示されます。 どなたか解決方法ご存知の方いらっしゃいましたら ご回答お願いします。

    • ベストアンサー
    • CGI
  • Perlからメール送信で文字化け

    Perl5.8からsendmailを使ってメール送信しています。 髙や﨑が入ると文字化けします。文字化けしないようにする方法を教えてください。 #!/usr/bin/perl require 'jcode.pl'; require 'mimew.pl'; $sendmail = '/usr/lib/sendmail'; print"Content-type: text/html\n\n test\n"; if (!(open(OUT,"| $sendmail -t -i -f xxxx\@hogehoge.co.jp"))) { ; } print OUT "To: xxxx\@hogehoge.co.jp\n"; print OUT "From: xxxx\@hogehoge.co.jp\n"; print OUT "Reply-To: xxxx\@hogehoge.co.jp\n"; $subject = "サブジェクト 髙﨑"; $subject = &mimeencode($mail_subject); print OUT "Subject: $mail_subject\n"; print OUT "Mime-version: 1.0\n"; print OUT "Content-Type: text/plain\; charset=\"ISO-2022-JP\"\n"; print OUT "Content-Transfer-Encoding: 7bit\n\n"; $honbun = "メール本文 髙﨑"; &jcode'convert(*honbun, 'jis'); print OUT "$honbun\n"; close(OUT);

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

    CGIプログラムでうまく日本語が表示できません。 表示できても、余分な文字列が入ってしまいます。ソースは以下です。 #!/usr/bin/perl -w print "Content-type: text/html\n\n"; use DBI; use CGI; $q = new CGI; print $q->header; $no = $q->param('no'); $program= $q->param('program'); my $UDBNAME=""; my $USERNAME=""; my $USERPASS=""; my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS); my $sth=$db->prepare(" select * from server where no = $no "); $sth->execute; my $num_rows=$sth->rows; if($num_rows <= 0){ print <<"_HTML_"; <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=ecu-jp"> </HEAD> <BODY> <TITLE>Server Search</TITLE> <img src = "http:///Logo.gif"> <BR> <HR width="90%"> <BR> <BR> 文字化け確認! <BR> <BR> <HR width="90%"> </HTML> _HTML_ 以上のようなプログラムをブラウザーで表示させると 先頭行に  Content-Type: text/html; charset=ISO-8859-1 と表示されてしまいます。文字化けはしないのですが、余計な Content-Type: text/html; charset=ISO-8859-1 はどうしたら取り除けるのでしょうか? ちなみにapacheの設定も AddLanguage ja .ja を先頭に LanguagePriority ja en ca cs AddCharset EUC-JP .euc-jp .cgi を先頭に のように設定しております。 もし、お分かりの方教えてください。

    • ベストアンサー
    • CGI
  • cgi(perl)でパラメータが渡せない

    以下のプログラムでnum=9が伝わらないので、ミスをご指摘ください。 グラフィカルなアクセスカウンタを表示させようとしていますが うまくいかないのでテキストモードでデバッグしています。 [ /usr/local/apache2/htdocs/gif-view.html ] <html> <head> <meta http-equiv="Content-type:" content="text/html; charset=UTF-8"> <title>gif-view</title> </head> <body> <iframe src="/cgi-bin/gif-test.cgi?num=9"></iframe> <!-- <img src="/cgi-bin/gif-test.cgi?0" width=50 height=50> --> </body> </html> [ /usr/local/apache2/cgi-bin/gif-view.cgi ] permission は 755 にしています。 #!/usr/bin/perl print "Content-Type: text/plain;\n\n"; print "gif-test.cgi\n"; $prm0 = @ARGV[0]; if($prm0 = "") { print "Param is exist\n"; } else { print "Param is empty\n"; 実行結果として gif-test.cgi Param is empty となります。 httpd.conf で Script Alias /cgi-bin/ "/usr/local/apache2/cgi-bin/" を有効にしています。

    • ベストアンサー
    • Perl
  • ファイルダウンロードで、DBCSファイル名が文字化け

    Perlで、ヘッダーを付けてファイルをダウンロードするスクリプトを作っています。 以下のように、test.html(EUC)からattach.cgi(Shift-JIS)へ飛びますが、IEとFirefoxで動作が違います。 ・IE: ファイル名が化けない ・Firefix : ファイル名が化ける おそらく、Firefoxの場合、呼び出し元がEUCなので、その先のattach.cgiもEUCだと決め付けているのでしょう。 試しに、attach.cgiをEUCにした場合、動作が逆になります。 ・IE: ファイル名が化ける ・Firefix : ファイル名が化けない ブラウザに対して、「ファイル名はShit-JISです」と宣言できるような文があればと思って調べているのですが、見つかりません。 ファイル名が化けないようにする方法がありましたらご教授いただけますと助かります。 ■==== test.html (EUC) ======= <HTML> <HEAD><meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"></HEAD> <BODY> <a href="attach.cgi">添付ファイルのテスト</a> </BODY> </HTML> ■==== attach.cgi (Shift-JIS) ======= $filename="日本語のテストです.txt"; print "Content-type: application\n"; print "Content-Disposition: attachment; filename=$filename\n\n"; ■テストした環境 IE 6.0 Firefox 2.0.0.8 WindowsXP(sp2) Perl 5.8.8 よろしくお願いします。

    • ベストアンサー
    • CGI
  • CGIで作ったHTMLの文字化けについて

    CGIのヘッダを "Content-type: text/html\n\n" として、HTMLをブラウザに出力するcgiを作っているのですが、 「表示」という文字が「侮ヲ」と文字化けしてしまいます。 HTMLの<head></head>内には print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=shift-jis\">"; と記述して日本語を指定しています。 文字化けの原因がまったくわかりません。 心当たりありませんでしょうか?

    • ベストアンサー
    • Perl
  • perlのcgiが文字化けします。

    perlを使ったcgiを作ろうと思い、こんなプログラムを書いてみたのですが、htmlのタグに囲まれた部分の日本語が文字化けしてしましいます。ファイルの文字列は上手く表示できるのですが… どうすればいいでしょうか。 文字コード判別をしてみたところ、このプログラム自体はShift-JISで書かれているようです。 開いているファイルはutf-8のようです。 #!/usr/bin/perl #ヘッダの表示 print "Content-Type: text/html; charset=utf-8\n\n"; print "<html>\n"; print "<head><title>掲示板</title></head>\n";#これが文字化け print "<body>\n"; print "<input type=\"text\" name=\"mail\" size=\"20\" value=\"\"><br>\n"; print "メッセージ<br>\n";#これも文字化け my $File = 'party0339.html'; if (-e $File) { #####@ファイルを開く…上でファイルが存在してることを確認して開けない場合はエラーメッセージ open(FF,"<:utf8",$File) or die "ファイル:$File を開けない $! \n"; my @FILE = <FF>; close (FF); ####@読み込んだデータを$Dataに格納する foreach (@FILE) { $Data = $_; print "$Data<br>\n"; } } #フッタの表示 print "</body>\n"; print "</html>\n"; exit (); 対策や原因などを教えてくださるとありがたいです。よろしくお願いします。

専門家に質問してみよう