• 締切済み

CGIから出力される文字が化けて表示される

メールフォームのCGIが出力するHTMLがブラウザで正常に表示されません。 HTMLで書いたメールフォームから、CGIを使って指定メールアドレスに文面を送信するページを作っています。 CGIとメールフォームは、ページを設置するレンタルサーバのサポートから入手した、公式のバージョンに手を加えて使っていますが、動作中に表示されるページの一部が文字化けする障害が発生してしまいます。 状況は下記の通りです。 1.フォームの送信ボタンを押すと、内容確認を促すページにジャンプ、もし入力漏れがあれば   警告ページにジャンプするのですが、どちらにジャンプしても表示が化けてしまいます。 2.文字コードを確認すると、CGIから出力されたHTMLが欧文(ISO)形式として認識されています。 3.CGIと、呼び出しに使っているHTMLはEUC形式で保存されているので、表示モードをEUCに   切り替えると、正しい内容で表示されます。   また、実際にメールを送信すると、受信メールも正常に送られています。 4.送信が正常に済むと、その旨を確認するページが表示されるのですが、そのページは正しく   表示されます。(文字化け表示のまま遷移しても、正しく表示されます) 5.文字化けしているページのソースを確認すると、一応charasetでコードがEUCに定義されている   ようなのですが、ブラウザ側では認識されていないようです。 画面の遷移を整理しますと、【フォーム】>【確認/警告】>【送信完了確認】となりますが、真ん中にある「確認/警告」の両ページのみが文字化けする、という感じです。 何か対応方法をご存知でしたら、ご教授頂けますでしょうか。 よろしくお願い致します。

みんなの回答

  • neepon
  • ベストアンサー率100% (3/3)
回答No.5

start_htmlメソッドを使用していませんか? 使用しているのであれば、「charset」「encoding」「lang」 などの引数を設定してみてください。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.4

sub HtmlTop { my($self,@p) = self_or_default(@_); return $self->start_html(@p); } CGI.pm に定義されている HtmlTop 関数は、上記のようになっています。単に内部から start_html() 関数を呼び出しているだけのものです。コマンドラインから実行すると、出力の様子を見ることができます。 > perl -MCGI -e "print &CGI::HtmlTop();" No2 の補足に書かれている <!DOCTYPE html から <body> までが出力されます。<script ... と <meta ... の2つは出力されませんが、ソースコードには出力させるためのコードが含まれているはずです。なお、どのように直すかについては簡単に言うことはできません。

zannenmaru
質問者

お礼

ご返信が遅くなってしまい、申し訳ありません。 その後、サーバの管理に問い合わせたところ、CGIの改修版を入手することが出来まして、 無事納品を完了しました。 (ちなみに、サンプルで配布されていたのが2002年の版で、改修版は2010年でした…) 内容を比較してみたところ、スクリプトの中にあった 「print &CGI::PrintHeader;」 の一文がコメント文に変更されたり、「print "Content-Type:text/html\n\n";」のように 修正されていたのが分かりました。 こちらも色々と迷走しましたが、kumozさんをはじめとする皆さんのご助力のお陰で 何とかゴールすることが出来ました。 遅ればせながらお礼を申し上げます。 ありがとうございました。

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

No2 の補足を見ると、CGI.pm と手書きの両方で出力されているのではないかと思います。CGI のソースファイルに次のような行がないか確認してみてください。なお、行が連続しているとは限りません。 use CGI; my $q = new CGI; print $q->header(...); print $q->start_html(...); CGI.pm では、文字コードの指定がなかったり、誤りがあるとデフォルト値の iso-8859-1 になってしまいます。そのため、文字化けが発生しているものと思われます。 ともかく、2重に出力される部分を整理しなければなりません。CGI.pm を使って出力を行うのか、手書きで出力を行うのかを検討してみてください。

zannenmaru
質問者

補足

ご回答ありがとうございます。 調べてみたところ、こちらのCGIでは提示して頂いた4行のスクリプトのうち、 下3行分に相当する部分が見付かりませんでした。 (1行目の「use CGI;」だけは記述がありました) 重複する二つ目のヘッダ(EUC-JPの方)を出力していた部分は特定出来ました。 しかし「iso-8859-1」の出力の原因になっているとおぼしき場所の記述が、 一見正しく見えるのですが、どう直してもこちらの思惑通りには動いてくれません。 print "Content-Type:text/html;charset=\EUC-JP\n"; print "\n"; print &CGI::HtmlTop($title); このようになっているのですが、どこが間違っているのでしょうか?

  • tomaju
  • ベストアンサー率76% (84/110)
回答No.2

> その代わりといっては何ですが、おかしな事に気付きました。 > 出力されたHTMLの中に、「charset=iso-8859-1」となっている箇所があるのです。 > CGIを調べてみましたが、このようなコードを指定してる箇所は見受けられませんでした。 CGI プログラムの中に記述がないとすると、HTML部分が 別のファイルになっていたりしないでしょうか?

zannenmaru
質問者

補足

別のファイル、というのがどれを指しているのか分からないのですが、代わりにファイルの構成と画面遷移をもう一度整理し直して書き出してみます。 ※ウインドウ及びフレームは【】、画面遷移は<>で括って表記しています。 【index.html】ページの基礎部分でフレームを定義している。   【contact.html】「index.html」のフレーム内に表示されるページ。次の「form.html」を開くリンクボタンがある。    ↓ (別窓で開く) 【form.html】入力フォームを表示。ここで入力された情報が「mail_form.cgi」に送られる。       ※ファイルのエンコード形式、及び「charset」で定義されているコードは「EUC」    ↓ <mail_form.cgi>「form.html」から送られた情報(text)を確認画面として表示するhtmlを生成してブラウザに返す    ↓ <送信内容の確認画面>「mail_form.cgi」から送られたhtmlで表示。《文字化けしている》    ↓       ※1.このページのソースに「charset=iso-8859-1」の記述がある    ↓       ※2.エンコードモードを「EUC」に切り替えると文字化けは解消する    ↓       送信ボタンを押すと、情報を送信した後、「mail_form.cgi」に確認コードを送り、    ↓       同CGIが送信確認画面を表示するhtmlをブラウザに返す    ↓ <送信確認画面>「mail_form.cgi」から送られたhtmlで表示。表示は正常。 上記のような構成になっています。 その後、別方面からの情報で、コード変換を行っている「jcode.pl」というPerlスクリプトが古いのでは、という指摘があったため、こちらも最新版に交換してみたのですが、状況は改善しません。 それから、「送信内容の確認画面」のソースのヘッダ部分を転載しておきます。 ============================================================================ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"> <head><script src="/A2EB891D63C8/avg_ls_dom.js" type="text/javascript"></script> <title>Untitled Document</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <head> <meta http-equiv="Content-Type" Content="text/html; charset=EUC-JP"> </head> ============================================================================ 何故かヘッダが分割(重複?)されていて、ファイル形式とコード定義が二重に為されているのが気になるのですが…

  • tomaju
  • ベストアンサー率76% (84/110)
回答No.1

charaset ではなくて charset ですかね。 もしかすると、HTTPレスポンスヘッダの charset と、 HTMLファイルの文字コードに食い違いがあるかもしれませんね。 CGIプログラムが Perl で書かれているならば、 Content-Type を送出しているところを確認し、 charset=EUC-JP にしてみてはどうでしょうか。 例えば、 print "Content-Type: text/html; charset=EUC-JP\n"; print "\n"; http://rfs.jp/sb/perl/03/03.html

zannenmaru
質問者

補足

ご回答ありがとうございます。 アドバイスを参考に修正してみたのですが、状況に改善が認められません… その代わりといっては何ですが、おかしな事に気付きました。 出力されたHTMLの中に、「charset=iso-8859-1」となっている箇所があるのです。 CGIを調べてみましたが、このようなコードを指定してる箇所は見受けられませんでした。 表示時に、勝手にISOに切り替わってしまう原因はこれだと思うのですが、このようなスクリプトが出力される理由がわかりません。 いったい何が原因なのでしょうか…

関連するQ&A