Perl CGI文字化け解消方法とリンク付け方法について

このQ&Aのポイント
  • PerlにてCGIを勉強しようと初掲示板を作ってみましたが、日本語を入力すると文字化けしてしまいます。そこで、文字化け解消方法について教えてください。
  • また、入力フォームの下に[1~][11~][21~][最新10件]のようなリンクを付けたいです。リンクの付け方についても教えてください。
  • 以上2点について、Perl CGIの初掲示板での文字化け解消方法とリンクの付け方を教えてください。
回答を見る
  • ベストアンサー

perl cgi文字化け解消方法と[1~][11~][21~][最新10件]のようなリンクを付ける方法。

perlにてcgiを勉強しようと初掲示板を作ってみました。 しかし、日本語を入力すると文字化けしてしまいます。 また、入力フォームの下に[1~][11~][21~][最新10件]のようなリンクを付けたいです。 以上2点のやり方を教えて下さい。お願いします。 #!/usr/bin/perl -w use strict; use warnings; use Encode; use utf8; use CGI; print "location: ./bbs.html\n\n"; print "Content-type: text/html\n\n"; my $q = new CGI; my $name = $q->param('name'); my $body = $q->param('body'); $name =~ s/</&lt;/g; $name =~ s/>/&gt;/g; $body =~ s/</&lt;/g; $body =~ s/>/&gt;/g; $body =~ s/\n/<br \/>/g; my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time); $year += 1900; $mon += 1; $wday = sprintf("%s", qw(日 月 火 水 木 金 土)[$wday]); my $time = sprintf "$year/%02d/%02d($wday) %02d:%02d:%02d",$mon,$mday,$hour,$min,$sec; open LOG, ">> log.txt"; print LOG "$time<>$name<>$body\n"; open LOG, "< log.txt"; my @log = <LOG>; close LOG; open HTML, "> bbs.html"; print HTML << "END"; <html> <head> <style> body{background:#f0f0f0;} span.name{color:blue;} p.body{margin-left:32px;} </style> <script type="text/javascript"> <!-- function check(form){ function id(id){return(document.getElementById(id));} if(form.name.value == "" || form.body.value == ""){ id('err').innerHTML = "入力に誤りがあります<br />"; id('err').style.color = "red"; return false; }else{ return true; } } //--> </script> <title>簡易掲示板</title> </head> <body> <form action="bbs.cgi" method="post" onsubmit="return check(this)"> <fieldset> <legend>入力フォーム</legend> <span id="err"></span> <label>名前</label><br /> <input type="text" name="name" /><br /> <label>本文</label><br /> <textarea name="body"></textarea><br /> <input type="submit" value="書き込み" /> </fieldset> </form> <hr /> END close HTML; open HTML, ">> bbs.html"; my $num = 0; for(@log){ $num++; chomp($_); my @write = split /<>/, "$_"; print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p>\n<p class='body'>$write[2]</p>\n"; } print HTML << "END"; <hr /> <a href="dammy">TOP</a> </body> </html> END close HTML; exit; よろしくお願いします。

  • Perl
  • 回答数3
  • ありがとう数14

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

  • ベストアンサー
  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.3

<つづき> my $num = 0; my $p = int(@log/10); if(@log%10){$p+=1} my$index; my$pg=1; my$s=1; my$l=10; if(@log>10){  $index=qq(<a href="bbs.html">[最新の10件]</a> );  for(2..$p){   $s+=10;$l=$_==$p?scalar(@log):$l+10;   $index.=qq(<a href="bbs_$_.html">[$s‐$l]</a> );  } } @log=reverse(@log); for(@log){  chomp;  $num++;  my @write = split /<>/;  print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p><p class='body'>$write[2]</p>\n";  unless($num%10&&$num!=scalar(@log)){   print HTML << "END"; <hr> $index </body> </html> END   close HTML;   last if($pg==$p);   $pg++;   open HTML, "> bbs_$pg.html";   print HTML << "END"; <html> <head> <style> body{background:#f0f0f0;} span.name{color:blue;} p.body{margin-left:32px;} </style> <script type="text/javascript"> <!--  function check(form){  function id(id){return(document.getElementById(id));}  if(form.name.value == "" || form.body.value == ""){   id('err').innerHTML = "入力に誤りがあります<br>";   id('err').style.color = "red";   return false;  }else{   return true;  } } //--> </script> <title>簡易掲示板</title> </head> <body> <form action="bbs.cgi" method="post" onsubmit="return check(this)"> <fieldset> <legend>入力フォーム</legend> <span id="err"></span> <label>名前</label><br> <input type="text" name="name"><br> <label>本文</label><br> <textarea name="body"></textarea><br> <input type="submit" value="書き込み"> </fieldset> </form> <hr> END  } } exit; __END__

その他の回答 (2)

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

文字化けの原因は utf8.pm にあります。 use utf8 は必要無いです。 #!/usr/bin/perl -w use strict; use warnings; use Encode; # use utf8; use CGI; print "location: ./bbs.html\n\n"; print "Content-type: text/html; charset=UTF-8\n\n"; my $q = new CGI; my $name = $q->param('name'); my $body = $q->param('body'); if($name&&$body){  $name =~ s/</&lt;/g;  $name =~ s/>/&gt;/g;  $body =~ s/</&lt;/g;  $body =~ s/>/&gt;/g;  $body =~ s/(\x0D\x0A|[\x0A\x0D])+$//;  $body =~ s/\x0D\x0A|[\x0A\x0D]/<br>/g;  my($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);  $year += 1900;  $mon += 1;  $wday = sprintf("%s", qw(日 月 火 水 木 金 土)[$wday]);  my $time = sprintf "$year/%02d/%02d($wday) %02d:%02d:%02d",$mon,$mday,$hour,$min,$sec;  open LOG, ">> log.txt";  print LOG "$time<>$name<>$body\n"; } open LOG, "< log.txt"; my @log = <LOG>; close LOG; open HTML, "> bbs.html"; print HTML << "END"; <html> <head> <style> body{background:#f0f0f0;} span.name{color:blue;} p.body{margin-left:32px;} </style> <script type="text/javascript"> <!--  function check(form){  function id(id){return(document.getElementById(id));}  if(form.name.value == "" || form.body.value == ""){   id('err').innerHTML = "入力に誤りがあります<br>";   id('err').style.color = "red";   return false;  }else{   return true;  } } //--> </script> <title>簡易掲示板</title> </head> <body> <form action="bbs.cgi" method="post" onsubmit="return check(this)"> <fieldset> <legend>入力フォーム</legend> <span id="err"></span> <label>名前</label><br> <input type="text" name="name"><br> <label>本文</label><br> <textarea name="body"></textarea><br> <input type="submit" value="書き込み"> </fieldset> </form> <hr> END <つづく>

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

考えられるのは ・CGI->paramで受け取った文字列の扱い方が正しくない ・ファイルの入出力が正しくない の2点です。 前者は$name,$body両方を、バイト列からutf8フラグ付き文字列へと変換します。 次の記事が参考になると思います。 http://blog.livedoor.jp/dankogai/archives/51227060.html 後者は、ファイル入出力時の文字コードを指定するようにします。 次の記事が参考になると思います。 http://www.rwds.net/kuroita/program/Perl_unicode.html 特に「UTF8フラグとPerlIOレイヤ」「Wide character in print ...」が今回の件にあてはまるでしょう。 追加で >print "Content-type: text/html\n\n"; を print "Content-type: text/html;charset=utf-8\n\n"; として、文字コードを指定するといいかもしれません。

3104kita
質問者

補足

回答ありがとうございます。早速教えていただいたURLを見ながらソースをいじってみたのですが、うまくいきませんでした…。 26行目の $wday = sprintf("%s", qw(日 月 火 水 木 金 土)[$wday]); この部分の、曜日を英語表記にして、 81行目の print HTML "<p>$num:<span class='name'>$write[1]</span> $write[0]</p>\n<p class='body'>$write[2]</p>\n"; この部分の「:」を消せばフォームから送信した日本語もちゃんと文字化けしないで表示することができます。 ですが、曜日は日本語にしたいし「:」も消したくないので、教えて頂いたURLを参考に、 use open ":utf8"; を加えて、 print "Content-type: text/html;charset=utf-8\n\n"; にもしてみました。 $name = encode("utf-8",$name); とかも試してみましたが、どれもうまくいきません。 これは何が原因なのでしょうか? どうか教えて下さい。よろしくお願いします。

関連するQ&A

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

  • Perl文字列置き換えについて

    今日は、PerlとCGIについて、お聞きしたいことがあります。 ~s///;で、文字列の置き換えが出来ますよね? 実行しても、変な数字しか出てこないのです。^^; つまずいてしまいました。 以下、コードです。(プロバイダはぷららです) 実行URL http://www9.plala.or.jp/mura001/form2.html =============================================== #!/usr/local/bin/perl -w require "jcode.pl"; require "cgi-lib.pl"; $host=$ENV{'REMOTE_HOST'}; #IP取得 $addr=$ENV{'REMOTE_ADDR'}; $bo=$ENV{'HTTP_UER_AGENT'}; $http=$ENV{'HTTP_HOST'}; #アクセス元URL $access=$ENV{'HTTP_REFERER'}; &ReadParse; #秒、分、時、日、年、月、曜日 ($sec,$min,$hour,$mday,$mon,$year,$wday)=localtime; $mon++; $year += 1900; #曜日を日本語化 @week=('日','月','火','水','木','金','土'); $wday=$week[$wday]; #<input type>のnameを読み込む。 $name = $in{'han'}; $text = $in{'text'}; #日本語レコード &jcode'convert(*name,'euc'); &jcode'convert(*text,'euc'); #文字列置換 $name = ~s/</555/; #改行二つ書かないといけないみたい。 print "Content-type: text/html\n\n"; print "<html>\n"; print "<head>\n"; print "<title>テスト</title>\n"; print "</head>\n"; print "<body>\n"; print "テストです。<br>\n\n"; if($in{'han'} eq ''){ print "何も入力されていません。<br><br>\n"; exit(); } print "貴方が入力した名前は $name ですね。<br><br>\n\n"; print "$text<br><br>\n\n"; print $ENV{'PATH'},"<br><br>\n\n"; &file2(); print "書き込みリスト<br><br>\n\n"; &file(); print "</body>\n"; print "</html>\n"; sub file{ open(IN,"test.txt"); while(<IN>){ print; } close(IN); } sub file2{ open(IN,">>test.txt"); print IN "<hr>訪問者:$name $year年$mon月$mday日($wday)$hour:$min:$sec<br><br>\n\n"; print IN $text,"<br><br>"; print IN "IPアドレス:$addr<br><br>\n\n"; print IN "アクセス元:<a href=\"$access\">$access</a><br><br><hr>\n\n"; close(IN); } ========================== $name = ~s/</555/; が、 4294967295 にどうしてもなります。^^; (置き換え後の文字列を他のに変更しても必ず、 4294967295 になります!) 分かる方、いらっしゃいますか? あと、日本語の変換が出来ません。(汗) それと、ぷららのサーバがかなり重たいのですが、どうすれば宜しいでしょうか? ご迷惑をおかけいたしますが、どうか、宜しくお願いいたします。

  • 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の文字化けについて

    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
  • 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
  • perl cgi 文字コード変換について

    掲示板でログファイルへの書き出しの際に文字コードをshift-jisに変更したいのですが, #投稿された値を受け取る if ($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); } else { $alldata = $ENV{'QUERY_STRING'}; } foreach $data (split(/&/, $alldata)) { ($key, $value) = split(/=/, $data); $value =~ s/\+/ /g; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('C', hex($1))/eg; $value =~ s/\t//g; $in{"$key"} = $value; } #ヘッダの表示 print "<html>\n"; print "<head><title>掲示板</title></head>\n"; print "<body>\n"; #受け取ったデータをファイルに書き込む if ($in{'handle'} ne '' && $in{'message'} ne '') { if (open(FH, "bbs.txt")) { @file = <FH>; close(FH); use CGI; $cgi=new CGI; $name1=$cgi->param('handle'); $name2=$cgi->param('number'); use Encode; use Encode::Guess qw(euc-jp shiftjis 7bit-jis); encode("shiftjis",decode('Guess',$name1)); encode("shiftjis",decode('Guess',$name2)); unshift(@file, "$name1\t$name2\n"); ##この部分で if (open(FH, ">bbs.txt")) { print FH @file; close(FH); } else { print "<p>ファイルに書き込めません。</p>"; } } else { print "<p>ファイルを読み込めません。</p>"; } } #投稿フォームの表示 print "<form method=\"post\" action=\"bbs.cgi\">\n"; print "<p>\n"; print "ハンドルネーム<br>\n"; print "<input type=\"text\" name=\"handle\" size=\"20\" value=\"\"><br>\n"; print "メッセージ<br>\n"; print "<input type=\"text\" name=\"message\" size=\"20\" value=\"\">\n"; print "</p>\n"; print "<p><input type=\"submit\" value=\"送信する\"></p>\n"; print "</form>\n"; #記事の一覧表示 if (open(FH, "bbs.txt")) { while ($data = <FH>) { ($handle, $message) = split(/\t/, $data); print "<p>\n"; print "投稿者:$handle<br>\n"; print "メッセージ:$message\n"; print "</p>\n"; } } else { print "<p>ファイルを読み込めません。</p>"; } #フッタの表示 print "</body>\n"; print "</html>\n"; exit; このような感じでかいたのですが文字コードを変更し,unshift(@file, "$name1\t$name2\n");と記述すると何も書かれずに空白になってしまいます..なぜでしょうか?困っています.教えて下さい. ちなみにunshift(@file, "$in{'handle'}\t$in{'message'}\n"); と文字コードの変更を意識しなかった場合にはちゃんとファイルに書かれています. jcode.plなどは使わずにencodeで行いたいです.

    • ベストアンサー
    • Perl
  • 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
  • CGI(Perl)を作ったがうまく実行されない

    度々すみません。 ~~~~HTML~~~~ <FORM action="test.cgi" method="POST" NAME="FORM"> <div>最大攻撃力:<INPUT type="text" NAME="att"><br></div> <div>防御力:<INPUT type="text" NAME="def"><br></div> <div>クリティ時与ダメ:<INPUT type="text" NAME="cyo"><br></div> <div>クリティ時被ダメ:<INPUT type="text" NAME="chi"><br></div> <div>EXD時与ダメ:<INPUT type="text" NAME="eyo"><br></div> <div>EXD時被ダメ:<INPUT type="text" NAME="ehi"><br></div> <INPUT type=submit value="実行"> <INPUT type=reset value="リセット"></TD> </FORM> ~~~~CGI~~~~ #! c:/perl/bin/perl if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair(split(/&/,$query)) { ($l_set,$value) = split(/=/,$pair); $form{$l_set}=$value; } $att=$form{'$att'}; $def=$form{'$def'}; $cyo=$form{'$cyo'}; $chi=$form{'$chi'}; $eyo=$form{'$eyo'}; $ehi=$form{'$ehi'}; $hi=int((($chi*2+$def)+(($ehi*2+$def)/1.2))/2); $yo=int(((($att-$cyo*2)*2)+(($att*1.2-$eyo*2)*2))/2); print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN"> <html> <head><title>被ダメテスト</title></head> <body><p>相手攻撃力は約<b>$hi</b>です。</p> <p>相手防御力は約<b>$yo</b>です。</p></body> </html> END このまま数値を入力して実行しても、「0」と出てきてしまいます。 読み込み(代入?)が出来ていないのでしょうか? 間違えている部分があればご指摘ください。 ※コンパイラはApacheです。

    • ベストアンサー
    • Perl
  • 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
  • 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の文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

専門家に質問してみよう