• 締切済み

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

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

  • CGI
  • 回答数5
  • ありがとう数2

みんなの回答

  • 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

  • CGIの文字コードについて

    CGIを下記URLのサイトから落として、メールフォームを設置しました。 http://www.synck.com/contents/download/cgi-perl/mailform_jcode.html 「メールフォームCGI UTF-8対応版」というメールフォームです。 mailformというフォルダの中に send.cgi(プログラム本体) check.cgi(設置確認プログラム) count.dat(通し番号を記録するファイル) があり、send.cgiはメールアドレス等を書き換える程度の編集をしております。 フォームには必須項目を設け、何も入力せずに送信ボタンを押すと、「●●が入力されていません」というようなダイアログが表示されます。ですが、必須項目を入力して送信ボタンを押すと500エラーがでます。 「●●が入力されていません」という表示がなされるということは、cgiの設置自体はとりあえずできていると考えてよろしいですよね? 文字コードが問題だと思い、検索かけてみたもののよく理解できず、色々な文字コードで保存しては、実際にアップしたメールフォームを使って試していたら、一度だけ、設定したメールアドレスにきちんとメールが届きました。しかし、自動で送信される送信内容を確認するメールの方が文字化けしてしまいました。 逆に、自動で送信される送信内容の確認メールは届かないが、文字化けしたメールが設置したアドレスに来たこともありました。 設置者へのメールを送信者への内容確認メールが文字化けせずにきちんと送れたことはありません!! 長くなりましたが、どの文字コードで読み込み、そしてどの文字コードで保存したら良いか分かりません。 cgiの編集はTerapad、サーバはさくらインターネットのライトです。 サーバへのアップは直接さくらインターネットにログインして行っております。 ※CGI初心者です。初めて設置する完全素人です。 よろしくお願いします!!

    • 締切済み
    • CGI
  • メール送信後のHTMLが文字化けします

    FORMからsendmailを利用してメールを送信し、その結果を「送信できた」、「未入力項目がある」などを出力するHTMLとして出力するcgiを作ったのですがHTML出力が文字化けします。 メールのsubjectやbodyは文字化けせず正常に送信できます。HTMLにはMETAタグでeuc-jpやshift_jisと色々とトライしました。cgiもshift_jisとeuc-jp両方で試しましたがどちらも文字化けします。文字化けしているときにブラウザのエンコードで自動選択すると、ブラウザがcgiの使用コードに自動的に合わせてくれて正常に表示してくれますがこれがcgiを起動するたびで面倒です。エンコードを自動選択しないと文字化けしてそのときのブラウザが選択している文字コードは「西ヨーロッパ言語(ISO)です。 どうしたらブラウザに使用している文字コードを認識させるられるでしょうか?

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

    WEBフォームからの入力データをHTMLに加工して表示するというシンプルなCGIプログラムなのですが、 全角スペースの後に全角カタカナが入ると、全角スペースの部分から後が文字化けしてしまいます。 他はきちんと表示されているのですが、全角スペースとカタカナが続いているのが良くないみたいで、文字化けしてしまうようです。 全角スペースを取ってしまえばいいのかと思い、WEBで検索して色々と試してみましたが、変わりません。。 このような場合はどういう対処をするのが一番いいのでしょうか。 文字コードはEUCを使っています。(WEBフォーム、CGIとも) 教えてください。よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • CGIでの文字コード

    多分とても基本的な質問なので、お恥ずかしいですがどなたかお教え下さい。 ちょっと試しに掲示板を作ったのですが、EUCでCGIを書きました。 ところがこのページを表示させるとJISになってしまって文字化けが起きてしまいます。 その際、表示⇒エンコードでEUCに変えるとちゃんと表示されるのですが、 毎度毎度面倒です。 このページを開いたとき、EUCをちゃんと自動で選択するようにするにはどうしたら良いのでしょうか。

  • CGIフォームから飛ばすメールがMacのMailで本文だけ文字化け

    フリーCGIのメールフォームをちょこっとカスタマイズして使用しています。 基本的にJISで作られていて、当然ウィンドウズでは正常にメールを表示することができるのですが、我が家のMacのほうで使っているMailというソフトで確認するとメールタイトルは問題ないのですが、本文が文字化けを起こしてしまっています。 フリーCGIといっても色んなものがあるのでアドバイスをいただきにくいと思うのですが、どのポイントにどのような記述が必要であるなどを教えていただけたら幸いです。 補足★全体をEUCに直す方法もやってみましたが、種類の違う文字化けになりました。検索でいろいろ調べてみると、JISでもきちんとカスタマイズすれば文字化けをしないという書き込みがありましたので、JISの方向で進めたいと思っています。 ちょっとしたことでもいいのでよろしくお願いします!

    • ベストアンサー
    • CGI
  • cgiスクリプトの文字化け

    既存のCGIライブラリ(cgi-lib.plとjcode.pl)を用いて、登録フォームを作りました。しかし、「入力」を押して、CGIを作用させると、文字化けがおこってしまいます。 cgiのなかで、文字コードをeucに変換しています。(jcode::convert機能)サーバーのCGI設定は全て確認しましたし、パーミッションも確認しています。文法などはあってると思いますし、ディレクトリ、文字コード(euc)・改行コード(LF)も確認しています。 他に原因があると思うのですが、回答よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • cgiでの文字化け

    <TD bgcolor="#ffffff" align="center">¥36000<BR>個数 <SELECT name="商品名:白雲"> <OPTION value="" selected>--</OPTION> <OPTION value="1"> 1</OPTION> <OPTION value="2"> 2</OPTION> </SELECT></TD> 上記記述がHTML内にあるのですが、これをmail.cgiを使って送信すると 確認画面や送信されたメールで文字化けをしてしまいます。 文字化けするのは「雲」という文字で、雲の文字を空などにしても文字化けしません。 他の項目もあるのですが、こちらも文字化けしません。 ちなみに、textエリア内に書き込まれた雲と言う文字も文字化けしません。 なぜ、雲という文字だけ文字化けしてしまうのでしょうか? どうにかして雲を表示させる方法はありますか?

    • ベストアンサー
    • CGI
  • CGIプログラムを使った申し込みフォームをHTML形式のメールで送りました。ソースを開くと文字化けしてしまいます。

    CGIプログラムを使うことにより、WEB上から申し込みフォームを使って入力事項をHTML形式によりメールしました。しかし、ソースを開いてみると文字化けしています。 CGIプログラムは、Shift JIS で保存したものを送信しているのですが。。 どうすれば、文字化けしない、きれいなソースが見れるようにできるでしょうか?

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

    登録フォームを作成し、入力した内容でDBに追加を行うなかで、PHPmyadminで実際に見てみると文字化けしています。 レンタルサーバ(OS:linux) (1)登録フォーム(shift_jis) ↓各値を渡す (2)確認ページ(shift_jis) ↓各値をmb_convert_encoding(shift_jisに変更) (3)追加 すると文字化けします。 以前、cgi-lib.plを用いてperlで書いていたものは、 文字化けしていません。 どこがおかしいのでしょうか? ちなみに (1)登録フォーム(euc-jp) ↓各値を渡す (2)確認ページ(euc-jp) ↓各値をmb_convert_encoding(euc-jpに変更) (3)追加 としても文字化けしています。 (DBだけでなく、ページ全体も)

    • ベストアンサー
    • PHP
  • 自作cgiのページがIE10で文字化けする

    Perlでcgiのページを作っています。文字コードはEUCです。 最近、IEのバージョンを8から10にアップグレードしたのですが、 自分の作ったページが、たまに文字化けするようになりました。 IE10のエンコード設定は「自動選択」にしていますが、 自動で「西ヨーロッパ言語(ISO)」に判断されてしまいまうことがあります。 Perlのcgiの文字コードはEUCで、ソースには以下のようにEUC-JPを指定しています。 <meta http-equiv="Content-Type" content="text/html;charset=EUC-JP"> 手でIE10の文字コードをEUCに設定すれば文字化けは直るのですが、 数日経つとまた同じように文字化けで「西ヨーロッパ言語(ISO)」に自動判断されてしまいます。 metaでEUC-JPをしていればブラウザ側で自動判断してくれると思っていたのですが、違うのでしょうか? HTMLでmeta以外に文字コードを指定するところがあるのでしょうか?

    • ベストアンサー
    • Perl

専門家に質問してみよう