メールフォームのCGIが出力するHTMLがブラウザで正常に表示されません。
HTMLで書いたメールフォームから、CGIを使って指定メールアドレスに文面を送信するページを作っています。
CGIとメールフォームは、ページを設置するレンタルサーバのサポートから入手した、公式のバージョンに手を加えて使っていますが、動作中に表示されるページの一部が文字化けする障害が発生してしまいます。
状況は下記の通りです。
1.フォームの送信ボタンを押すと、内容確認を促すページにジャンプ、もし入力漏れがあれば
警告ページにジャンプするのですが、どちらにジャンプしても表示が化けてしまいます。
2.文字コードを確認すると、CGIから出力されたHTMLが欧文(ISO)形式として認識されています。
3.CGIと、呼び出しに使っているHTMLはEUC形式で保存されているので、表示モードをEUCに
切り替えると、正しい内容で表示されます。
また、実際にメールを送信すると、受信メールも正常に送られています。
4.送信が正常に済むと、その旨を確認するページが表示されるのですが、そのページは正しく
表示されます。(文字化け表示のまま遷移しても、正しく表示されます)
5.文字化けしているページのソースを確認すると、一応charasetでコードがEUCに定義されている
ようなのですが、ブラウザ側では認識されていないようです。
画面の遷移を整理しますと、【フォーム】>【確認/警告】>【送信完了確認】となりますが、真ん中にある「確認/警告」の両ページのみが文字化けする、という感じです。
何か対応方法をご存知でしたら、ご教授頂けますでしょうか。
よろしくお願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
start_htmlメソッドを使用していませんか?
使用しているのであれば、「charset」「encoding」「lang」
などの引数を設定してみてください。
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つは出力されませんが、ソースコードには出力させるためのコードが含まれているはずです。なお、どのように直すかについては簡単に言うことはできません。
ご返信が遅くなってしまい、申し訳ありません。
その後、サーバの管理に問い合わせたところ、CGIの改修版を入手することが出来まして、
無事納品を完了しました。
(ちなみに、サンプルで配布されていたのが2002年の版で、改修版は2010年でした…)
内容を比較してみたところ、スクリプトの中にあった
「print &CGI::PrintHeader;」
の一文がコメント文に変更されたり、「print "Content-Type:text/html\n\n";」のように
修正されていたのが分かりました。
こちらも色々と迷走しましたが、kumozさんをはじめとする皆さんのご助力のお陰で
何とかゴールすることが出来ました。
遅ればせながらお礼を申し上げます。
ありがとうございました。
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 を使って出力を行うのか、手書きで出力を行うのかを検討してみてください。
この回答への補足
ご回答ありがとうございます。
調べてみたところ、こちらの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);
このようになっているのですが、どこが間違っているのでしょうか?
No.2
- 回答日時:
> その代わりといっては何ですが、おかしな事に気付きました。
> 出力されたHTMLの中に、「charset=iso-8859-1」となっている箇所があるのです。
> CGIを調べてみましたが、このようなコードを指定してる箇所は見受けられませんでした。
CGI プログラムの中に記述がないとすると、HTML部分が
別のファイルになっていたりしないでしょうか?
この回答への補足
別のファイル、というのがどれを指しているのか分からないのですが、代わりにファイルの構成と画面遷移をもう一度整理し直して書き出してみます。
※ウインドウ及びフレームは【】、画面遷移は<>で括って表記しています。
【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-transitio …
<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>
============================================================================
何故かヘッダが分割(重複?)されていて、ファイル形式とコード定義が二重に為されているのが気になるのですが…
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
この回答への補足
ご回答ありがとうございます。
アドバイスを参考に修正してみたのですが、状況に改善が認められません…
その代わりといっては何ですが、おかしな事に気付きました。
出力されたHTMLの中に、「charset=iso-8859-1」となっている箇所があるのです。
CGIを調べてみましたが、このようなコードを指定してる箇所は見受けられませんでした。
表示時に、勝手にISOに切り替わってしまう原因はこれだと思うのですが、このようなスクリプトが出力される理由がわかりません。
いったい何が原因なのでしょうか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- Excel(エクセル) エクセルの数式で教えてください。 1 2023/04/21 08:59
- HTML・CSS HTMLを正しく表示させるには 2 2023/06/18 09:12
- Amazon Amazonショッピングのアプリで中々サインイン出来なくて困っています。 メールアドレスとパスワード 1 2023/04/09 23:04
- gooポイント gooポイントをdポイントに交換できない。 3 2022/04/22 20:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
結果を得て自動的にページ移動...
-
my $html<<EOMの意味を教えてく...
-
ランダムに背景画像を変える方法。
-
テキストエリアにテキストファ...
-
UTF8 URLエンコード
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
formで特定のinputを送信しない...
-
<SELECT>タグの折り返し
-
16進の10進変換について
-
実行時エラー 3020の対策
-
文字の横にプルダウンを表示さ...
-
デ-タテ-ブルの内容での更新...
-
セレクトメニューで2つの項目...
-
数値英単語変換
-
セレクトボックスのselected属...
-
複数列を持ったリストボックス...
-
selectタグ内の特定のoptionの...
-
【メモリ不足で落ちる(python)】
-
STLのlistで重複するものだけを...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
malformed header from script....
-
結果を得て自動的にページ移動...
-
Perl CGIの中で # を使ってコメ...
-
my $html<<EOMの意味を教えてく...
-
テキストファイルの読み込み
-
どうしてもCookieとCGI・perlの...
-
パソコン → パャRン
-
Perlでの数字の12桁化
-
shift-jisからutf8に変換
-
サムネイルCGI
-
SSI にグローバル変数を渡すこ...
-
CGIから出力される文字が化けて...
-
cgiでのデータ受信
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
どちのほうがすきですか?
-
formで特定のinputを送信しない...
-
文字の横にプルダウンを表示さ...
-
16進の10進変換について
-
実行時エラー 3020の対策
おすすめ情報