• 締切済み

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 (); 対策や原因などを教えてくださるとありがたいです。よろしくお願いします。

  • izha
  • お礼率0% (0/34)
  • Perl
  • 回答数3
  • ありがとう数0

みんなの回答

noname#189141
noname#189141
回答No.3

> 1についてなのですが、webサーバで解釈できる文字コードはどのようにして調べればいいでしょうか? サーバーの文字コードはサーバーの管理者にご確認ください。 もし、Windowsでサーバーを実行しているようであれば、utf-8ではなく、ShiftJISである場合が多いです。 > また、文字コードを指定して書くというのは、プログラムを保存する際に文字コードを指定して保存すれば良いのでしょうか。 それでも良いですし、クライアントで記載する際はShiftJISなどのクライアントで認識できるコードで保存し、サーバーに転送の際に文字コード変換をかけるという方法もあります。

noname#189141
noname#189141
回答No.2

原因は多数存在します。 (1) Webサーバーで解釈できる文字コードはutf-8で間違いないですか?  charset=utf-8 の指定がありますが、utf-8で動くWeb環境でしょうか? (2) ファイル転送時の文字コード  (1) が問題ないとして、Windows環境から転送する際に、正しく文字コード変換ができていますか?  ShiftJISで書いていたら、もちろん文字化けします。 (3) Webブラウザの文字コード認識に問題ないですか?  「自動認識」の場合、ブラウザによってはうまく認識されないことがあります。  別のブラウザで試すか、「自動認識」では無く明示的に指定してみてください。 (4) meta tagを入れてみる。(ブラウザに正しく文字コード認識をさせる)  対処療法かもしれませんが、meta tagで文字コードを指定すると解決することもあります。  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> (5) 同様にtitle tagより前に、日本語のコメントを入れることで、回避できることもあります。

izha
質問者

補足

回答ありがとうございます。とりあえず、今調べられる3番、4番、5番について確かめてみました。 1についてなのですが、webサーバで解釈できる文字コードはどのようにして調べればいいでしょうか? また、文字コードを指定して書くというのは、プログラムを保存する際に文字コードを指定して保存すれば良いのでしょうか。 metaタグを入れてみたのですが、自分の環境ではそれを入れるとページが白紙になってしまうようです。

  • Gletscher
  • ベストアンサー率23% (1525/6504)
回答No.1

単純に、「jcode.pl」がインクリュードしてないだけとか?

izha
質問者

補足

jcode.plはどのように使えば良いのでしょう。 色々見てみたのですが、どれも違う使い方をしているように見えて、どうすればいいのか解らなくなってしまいました。

関連するQ&A

  • 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
  • CGIでprint出力時に文字化けします・・・

    test.cgi (UTF-8)--------------------- #!/usr/bin/perl use utf8; print "Content-type: text/html;charset=utf-8\n\n"; open FILE, "test.txt"; while (<FILE>){ $read_list[$i]=$_; $i++; } print "あ=$read_list[0]<BR>\n"; print "a=$read_list[0]<BR>\n"; exit; ------------------------------- test.txt (UTF-8)-------------- テスト用投稿 ------------------------------- 上記の2種類のファイルを用意し実行したところ、下記の結果になります。 ↓-----------------------------↓ あ=i≫?a□□a□1a□□c□¨ф□□c¨?<BR> a=テスト用投稿<BR> ↑-----------------------------↑ 文字が正常に表示されないのですが、外国語?みないなまったく読めない文字になってしまいます。(コピペだと表示されないみたいなので、似たような感じで作りました。) 色々試してみたのですが、print="";の中に英数以外が入っていると文字化けするみたいです。 あ=テスト用投稿 a=テスト用投稿 としたいのですが、まったく解決方法がわかりません。 perlのバージョンは5.6.1です。 ファイルはすべてUTF-8で保存しています。 ブラウザもエンコードはUTF-8になっています。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • CGIでprint出力時に文字化けします・・・

    test.cgi (UTF-8)--------------------- #!/usr/bin/perl use utf8; print "Content-type: text/html;charset=utf-8\n\n"; open FILE, "test.txt"; while (<FILE>){ $read_list[$i]=$_; $i++; } print "あ=$read_list[0]<BR>\n"; print "a=$read_list[0]<BR>\n"; exit; ------------------------------- test.txt (UTF-8)-------------- テスト用投稿 ------------------------------- 上記の2種類のファイルを用意し実行したところ、下記の結果になります。 ↓-----------------------------↓ あ=&iuml;&raquo;&iquest;&atilde;ƒ†&atilde;‚&sup1;&atilde;ƒˆ&ccedil;”¨&aelig;Š•&ccedil;¨&iquest;<BR> a=テスト用投稿<BR> ↑-----------------------------↑ 文字が正常に表示されないのですが、外国語?みないなまったく読めない文字になってしまいます。 色々試してみたのですが、print="";の中に英数以外が入っていると文字化けするみたいです。 あ=テスト用投稿 a=テスト用投稿 としたいのですが、まったく解決方法がわかりません。 perlのバージョンは5.6.1です。 ファイルはすべてUTF-8で保存しています。 ブラウザもエンコードはUTF-8になっています。

    • 締切済み
    • CGI
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • 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において、エンコード・文字化けの対処方法

    以下のように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
  • PerlでRSS取得 ~ 文字化け ~ utf8→ShifJIS変換できない

    XML::RSSを使用してRSSのタイトルを取得するPerlスクリプトを作っています。 DBCSの場合、文字化けするので、以下のようにfrom_toを使用してutf8をShiftJISに変換しようとしましたが、エラーが出ます。 SBCSでは問題無いのですが。 Encode::Guessで調べるとutf8が返ってくるので、「from_to( $title, 'utf8','shiftjis' )」でutf8をShift-JISに変換すればよいのかと思ったのですが。 ■環境 ・perl v5.8.3 built for MSWin32-x86-multi-thread ・Windows2000(SP4) ■エラーメッセージ Cannot decode string with wide characters at c:/Perl/lib/Encode.pm line 184. ■ソース #!/usr/bin/perl BEGIN { use CGI::Carp qw(carpout fatalsToBrowser); carpout(STDOUT); } use Encode qw/ from_to /; use LWP::Simple 'get'; use XML::RSS ; print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD><meta http-equiv=\"Content-Type\" content=\"text/html;charset=Shift-JIS\"></HEAD>\n"; print"<BODY>\n"; my $rss = new XML::RSS; eval {   # $rss->parse( get('http://slashdot.org/slashdot.rdf') );    $rss->parse( get('http://oshiete1.goo.ne.jp/rss/oshiete_goo.xml') ); }; exit if $@; foreach my $ref( @{$rss->{items}} ) {   $title = $ref->{'title'};   $link = $ref->{'link'};   from_to( $title, 'utf8','shiftjis' );   print"[title] $title<br>\n";   print"[link] <a href=\"$link\" target=\"_blank\">$link</a><br>\n";   ----------------------------<br><br>\n"; } print"</BODY></HTML>\n"; RSSの取得方法はここを参考にしました。 http://www.rfs.jp/sb/perl/10/rss01.html 宜しくお願いします。

    • ベストアンサー
    • Perl
  • CGIの文字化けについて

    CGI初心者ですが、本とネットを調べてメールフォームを作成しています。 テストで作成していた時は何故かうまくいったのですが、 本番用サイトにアップしテストしてみると、自動返信メールが文字化けするようになってしまいました。 送信先は会社側がgmail、お客様側がスマホ(docomo)として自分のスマホに送っていますが、 gmailもスマホも本文のみが文字化けしています。 ネット上でも調べて、件名の文字化けは治すことが出来たのですが、本文がどうしても文字化けしてしまい、治せません。。。 HTMLの文字コードはUTF-8で、CGIもUTF-8Nで保存しています。 ほぼ本を見てそのまま作成し、修正部分だけネットで調べて追記していく、というような感じで 酷い内容のコードになってると思いますが。。 原因がわかる方がいらっしゃいましたら、是非ご教示頂ければと思っています。 また、こんな私に参考になるサイトがあれば教えて頂きたいです。 不明点は出来るだけ補足するつもりです。 宜しくお願いします。 どうかお助け下さい! ------------------------------------------------- 以下がコードです。 #!/usr/local/bin/perl #setting require './lib/cgi-lib.pl'; use lib './lib'; use Jcode; use CGI; use utf8; use Encode; #フォームから入力データ読込 &ReadParse(*in); $name = "$in{'name'}"; $subject = "$in{'subject'}"; $address = "$in{'address'}"; $at = '@'; $domain ="$in{'domain'}"; #★メール送信先★会社側メールアドレス $to = 'kaisya@gmail.com'; #★メール送信者名★会社名 $fromname='株式会社かいしゃ'; #★メール送信者表示アドレス★ $from = 'kaisya2@kaisya2.com'; #★メール送信用タイトル★ $fromsubject = 'WEB会員登録のお申込みありがとうございました'; #★メール送信用内容★ $from_msg = <<END_OF_DATA; WEB会員登録のお申込み、ありがとうございました。 以下のURLへアクセスし、ご登録を進めて下さい。 http://www.kaisya.xxxx また、このメールに心当たりのない方は、このメールは削除して頂きますようお願い致します。 ☆---------------------------------☆ 株式会社かいしゃ HP:http://www.kaisya.xxxx MAIL:kaisya2@kaisya2.com TEL:00-9999-9999 FAX:00-9999-8888 ☆---------------------------------☆ END_OF_DATA $nstatus = 0; $mstatus = 0; $dstatus = 0; #process before send $mailName = Jcode::convert( $name , "utf8", "utf8" ); $mailSubject = Jcode::convert( $subject , "utf8", "utf8" ); $soushin_name = Jcode::convert( $fromname , "utf8", "utf8" ); $from_msg = Jcode::convert( $from_msg , "utf8", "utf8" ); #未入力check if($address eq "" ){ $nstatus = 1; } #mailaddress check if($address =~ /[^a-z0-9_\-\.]/ ){ $mstatus = 1; } #domain check if($domain =~ /^$/ ){ $dstatus =1; } if($nstatus == 1 or $mstatus == 1 or $dstatus == 1){ &mailerror; } #mailaddress $mailaddress = $address . $at .$domain; #sendmail #会社側にメールを送る $soushin_name = encode('MIME-Header-ISO_2022_JP', $soushin_name); open(MAIL, "| /usr/sbin/sendmail -t"); print MAIL "To: $to\n"; print MAIL "From:$soushin_name<$from>\n"; print MAIL "subject: $mailSubject\n"; print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n\n"; print MAIL "名前: $mailName\n"; print MAIL "e-mail: $mailaddress\n"; close(MAIL); #sendmail2 #送信者側にメールを送る open(MAIL, "| /usr/sbin/sendmail -t"); print MAIL "To: $mailaddress\n"; print MAIL "From:$soushin_name<$from>\n"; print MAIL "subject: $mailSubject\n"; print MAIL "Content-Type: text/plain; charset=\"iso-2022-jp\"\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "{$from_msg}\n"; print MAIL "-------------------------------------\n"; print MAIL "以下の内容で送信されました\n"; print MAIL "名前: $mailName\n"; print MAIL "e-mail: $mailaddress\n"; close(MAIL); #display print "Content-type: text/html;charset=utf-8\n\n"; print "<html>\n"; print "<title>send result</title>\n"; print "<h1>send mail</h1><hr />\n"; print "以下のメールを送信しました<br />"; print "Name: $name<br />\n"; print "email: $mailaddress<br />\n"; print "</body></html>\n"; #サブルーチン メールアドレスにエラー sub mailerror{ print "Content-type: text/html;charset=utf-8\n\n"; print "<html>\n"; print "<title>mailaddress error</title>\n"; print "<body>\n"; print "<h1>send mail</h1><hr />\n"; if($nstatus == 1){ print "メールアドレスが入力されていません。<br />\n"; print "$nstatus<br />\n"; } if($mstatus == 1){ print "メールアドレスを正しく入力して下さい。<br />\n"; print "$mstatus<br />\n"; } if($dstatus == 1){ print "ドメインを選択して下さい。<br />\n"; print "$dstatus<br />\n"; } print "<a href=\"javascript: history.back()\">戻る</a><br />\n"; print "</body></html>\n"; exit; } exit;

    • ベストアンサー
    • CGI
  • ページの文字コードがUTF-8にならない

    PHP Version 5.1.6を使っています。 次のようにして、文字コードをUTF-8にしてコードもUTF-8で保存してアップロードし、 ページを表示しようとするとなぜか文字コードがShift_JISになったままで 何も表示されません。 ただ表示させてる"aaa・・・"をもう1行加えるとちゃんとUTF-8になり表示されます。 これから考えられる原因はなんなのでしょうか? print "<html>\n"; print "<head>\n"; print "<title>サンプル</title>\n"; print "<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n"; print "</head>\n"; print "<body>\n"; print "aaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>\n"; print "aaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>\n"; print "aaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>\n"; print "aaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>\n"; print "aaaaaaaaaaaaaaaaaaaaaaaaaaaa<br>\n"; print "</body>\n"; print "</html>\n";

    • ベストアンサー
    • PHP
  • document.writeからcgiへ出力すると文字化けします。

    フォームへ入力したデータを、いったんJavaScriptのdocument.writeでプレビューして、そこからCGIへ出力するプログラムを書いています。 プレビューせずにCGIに出力すると問題ないのですが、document.writeで出力すると、日本語が文字化けしてしまいます。半角英数字は大丈夫です。 document.writeした状態のソースをhtml化して出力するとこれまた大丈夫なのです。 コードを変えたり、jcode.plを利用させもらったりしたのですが、変わりませんでした。 CGIファイルのほうは途中で、この後、$valueをテキストファイルに出力したいと思っています。 もしお暇なときにでも、理由と対策を教えていただければ幸いです。 まだ不慣れなので、おかしいことをしていたら申し訳ありません。もっといい方法があれば、ぜひ教えてください。 入力用ファイル <html> <head> <script type="text/javascript"> function aaa(){ a=document.ff.tname.value; b=document.ff.tsono.value; document.write('<html>\n<head>\n</head>\n<body>\n'); document.write('<form name="ff0" method="post" action="test3.cgi">\n'); if(a==""){document.write('お名前欄が空です!<br>\n')}; if(b==""){document.write('その他欄が空です!<br>\n')}; document.write('お名前:<input type="text" name="t0name" style="border:none;font-size:16;" value="'+a+'"><br>\n'); document.write('その他:<input type="text" name="t0sono" style="border:none;font-size:16;" value="'+b+'"><br>\n'); document.write('<input type="button" value="戻る" onmousedown="window.history.back()">') if((a!="")&&(b!="")){ document.write('<input type="submit" value="送信">\n'); } document.write('</form>\n</body>\n</html>'); } </script> </head> <body onload="document.ff.tname.focus();"> <form name="ff" method="post" action=""> お名前:<input type="text" name="tname" style="ime-mode:active"><br> その他:<input type="text" name="tsono" style="ime-mode:inactive"><br> <input type="button" value="確認" onmousedown="aaa()"> </form> </body> </html> CGIファイル #!C:\Perl\bin\perl print "Content-type:text/html\n\n"; read (STDIN,$aaa,$ENV{'CONTENT_LENGTH'}); print "<html>\n<head>\n</head>\n<body>"; @bbb=split(/&/,$aaa); foreach $ccc(@bbb){ ($name,$value)=split(/=/,$ccc); $value=~ tr/+/ /; $value=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; print "$nameは$valueです。"; } print "</body>\n</html>";

    • ベストアンサー
    • Perl

専門家に質問してみよう