質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

4回答

3631閲覧

sformmail2というPHPプログラムの文字化け

NP3228

総合スコア22

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2016/11/08 00:31

編集2022/01/12 10:55

ホームページでsformmail2()というPHPのメールフォームを使っているのですが、一部分だけ、どうしても文字化けをしてしまいます。

使っているサーバーはさくらインターネットのスタンダードプラン()です。

sformmail2のsformmail.phpの中に、以下の記述があり、こちらが文字化けを起こします。(PHP内69〜97行目)

PHP

1// submit表示項目 2function printSubmit($error) 3{ 4 5 // 送信/戻るボタン表示設定 6 $button_text = array( 7 'send' =>"送 信" 8 , 'back' =>"戻 る" 9 ); 10 11 if ($error == 1) { 12 // エラーがある場合のHTML出力 13 $submit = <<< EOD 14<p class="ERR">必須項目の入力に不足があります。</p> 15<input type="button" name="back" id="back" value="{$button_text['back']}" onclick="history.back()" /> 16EOD; 17 } else { 18 // 項目が正しい場合のHTML出力 19 $submit = <<< EOD 20<p>入力が正しければ、送信ボタンを押してください。</p> 21<input type="hidden" name="mode" id="mode" value="SEND" /> 22<input type="submit" name="submit" id="submit" value="{$button_text["send"]}" /> 23<input type="button" name="back" id="back" value="{$button_text["back"]}" onclick="history.back()" /> 24EOD; 25 } 26 return $submit; 27}

本来ならば、送信ボタンと戻るのボタンが出てくるといった記述のはずが、以下のように文字化けを起こしてしまいました。
イメージ説明

HTML

1<h4> 2<p>?ュ????罩c???????違????篆<???帥?潟???若?????????????</p> 3<input type="hidden" name="mode" id="mode" value="SEND" /> 4<input type="submit" name="submit" id="submit" value="????篆? /> 5<input type="button" name="back" id="back" value="?祉????" onclick="history.back()" /> 6</h4>

$button_textの中に収納した「送 信」と「戻 る」が文字化けを起こし、HTMLタグに異常をもたらしてるのだと思って、文字コードを確認したところ「ASCII」だということがわかり、HTMLファイルの文字コードである「UTF-8」に合わせようと思い、以下のように変えても無駄でした。

<修正↓>

PHP

1$button_text = array( 2 'send' => mb_convert_encoding("送 信", "utf-8","ASCII") 3 , 'back' => mb_detect_encoding($button_text["send"]) 4 );

<結果↓>
イメージ説明

HTML

1 2 <h4> 3 <p>?ュ????罩c???????違????篆<???帥?潟???若?????????????</p> 4<input type="hidden" name="mode" id="mode" value="SEND" /> 5<input type="submit" name="submit" id="submit" value="辿??達??辰多臓" /> 6<input type="button" name="back" id="back" value="ASCII" onclick="history.back()" /> 7</h4>

色々と調べたのですが、自分では限界でした。
PHPの初心者のため、わかっていないことが多いので、足りない情報はすぐに出そうと思っています。なるべく早い返信をこころがけますので、よろしくお願いします。

追記
どのようなページか、素人ながら説明します。
sformmail.phpにアクセスすると、sfm_form.htmlのフォームを読み込み、そこに入力した後、送信ボタンを押すと、入力された情報がsfm_confirm.htmlに表示され、問題がなければ、送信ボタンが表示される、といった次第です。この二回目の送信ボタンが文字化けを起こします。

ちなみにsfm_confirm.html側の記述を↓のように変えても結果は全く変わりませんでした。

html

1<h4> 2<!--修正前:<?php echo $sfm_submit; ?> <?php $this->crCheck(); ?>--> 3<?php echo mb_convert_encoding($sfm_submit, "utf-8", "auto"); ?> <?php $this->crCheck(); ?> 4</h4>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

結論から先に言うと、ほかのソフトウェアを使うことを検討されたほうがよいと思います。


ソースコードを見てみたところ、このsformmmail2というPHPのプログラムは、内部エンコーディングにEUC-JPを前提としているようです。メインのプログラムファイル (sformmail.php) に、次の記述があります。

lang

1// 内部エンコードを設定(euc-jp 固定) 2$sfm_cfg['internal_enc'] = 'euc-jp'; 3new SbFormMailClass($sfm_cfg); 4exit; 5

内部エンコーディング$sfm_cfg['internal_enc']の値を、さくらインターネットでのPHPの内部エンコーディングの初期値 (UTF-8になっていると思われます) に変え、ソースファイルやHTMLファイルのすべてのエンコーディングを現状のEUC-JPからUTF-8に変えれば、あるいは動作するかもしれません (実際に確かめてはいません)。

しかしそれ以前に、EUC-JPを前提とするという、ウェブアプリケーションにしては今や古い作りであり、実際に4年以上前に更新が止まってしまってもいます。なんらかの不具合を抱えていたり、今後不具合が発見されたとしても、開発者によって修正される見込みがほぼありません

どうしても、どーうしてもこれを使わなければならない事情がないかぎり、ほかのソフトウェアを使うことを検討されたほうがよいと思います。

投稿2016/11/08 08:52

ikedas

総合スコア4227

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

アップロードしたファイル自身の文字コードは正しく設定されていますか?どのようなエディタを使っているかわかりませんが、エディタによっては日本語で編集した際にUTF-8ではなくSHIFT-JISで保存されることがあります。

投稿2016/11/08 08:05

kei344

総合スコア69364

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NP3228

2016/11/08 08:42

エディタですが、html、php共にDreamweaverCCを使っています。 DreamweaverCCの、[修正]ー[ページプロパティ]ー[タイトル/エンコーディング]で確認する限り、エンコーディング:Unicode(UTF-8)となっています。 さくらインターネットのファイルマネージャーでも確認がとれましたが、やはりUTF-8となっています。補足ですが、改行が「LF」種類でした。 何か、他に確認する点などあれば、お願いします。
kei344

2016/11/08 08:53

すみません、zico_teratailさんが既に指摘されていましたね。 ダウンロードしたところ、「euc-jp」にしか対応していないメールフォームなので、別のものを探されたほうが早いと思います。
guest

0

スクリプトの先頭に以下を追加してみてください。

php

1mb_language("ja"); 2mb_internal_encoding("UTF-8"); 3mb_language("Japanese");

さらに出力($submitをecho)する直前に以下を追加。

php

1header('Content-Type: text/html; charset=utf-8');

投稿2016/11/08 01:11

zico_teratail

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NP3228

2016/11/08 01:26

返信ありがとうございました。 以下のように、修正をしました。 function printSubmit($error) { mb_language("ja"); mb_internal_encoding("UTF-8"); mb_language("Japanese"); // 送信/戻るボタン表示設定 $button_text = array( 'send' =>"送 信" , 'back' =>"戻 る" ); if ($error == 1) { // エラーがある場合のHTML出力 header('Content-Type: text/html; charset=utf-8'); $submit = <<< EOD <p class="ERR">必須項目の入力に不足があります。</p> <input type="button" name="back" id="back" value="{$button_text['back']}" onclick="history.back()" /> EOD; } else { // 項目が正しい場合のHTML出力 header('Content-Type: text/html; charset=utf-8'); $submit = <<< EOD <p>入力が正しければ、送信ボタンを押してください。</p> <input type="hidden" name="mode" id="mode" value="SEND" /> <input type="submit" name="submit" id="submit" value="{$button_text["send"]}" /> <input type="button" name="back" id="back" value="{$button_text["back"]}" onclick="history.back()" /> EOD; } return $submit; } しかし、結果は変わらずでした・・・ なんでこのようになってしまうのでしょう・・・ <h4> <p>?ュ????罩c???????違????篆<???帥?潟???若?????????????</p> <input type="hidden" name="mode" id="mode" value="SEND" /> <input type="submit" name="submit" id="submit" value="?? 篆? /> <input type="button" name="back" id="back" value="? ??" onclick="history.back()" /> </h4>
zico_teratail

2016/11/08 01:37

違う違う、 mb_language("ja"); mb_internal_encoding("UTF-8"); mb_language("Japanese"); は、スクリプトの先頭に書いてください。 function内の先頭じゃなくて。 header('Content-Type: text/html; charset=utf-8'); もfunction内じゃなくて、実際に出力する命令の直前に置いてください。 それと、 <input type="submit" name="submit" id="submit" value="{$button_text["send"]}" /> <input type="button" name="back" id="back" value="{$button_text["back"]}" onclick="history.back()" /> ↑なぜこんな無意味な記述(いちいち配列を使って文字表示)なのか意図がよくわかりませんが、これは下記のような記述でいいのでは? <input type="submit" name="submit" id="submit" value="送 信" /> <input type="button" name="back" id="back" value="戻 る" onclick="history.back()" /> さらに、以下のこともチェックしてください。 ・そもそもスクリプトファイル自体のエンコーディングはutf-8で保存されてますか? ・出力されたHTMLのヘッダのcharset指定はどうなってますか? PHPよりもまず先にHTMLの基礎的な知識から勉強されたほうが良さそうですね・・・
NP3228

2016/11/08 02:38

すみません・・・初心者なもので・・・ 情報の小出しをしてすみませんが、追記をあげてますので、そちらも確認してもらえればと思います。 >無意味な記述 sformmail2という一個の完成されたものなので、初心者が触って、挙動が乱れるのを恐れて、あまり触らないようにしてます。 >スクリプトファイル自体のエンコーディング sformmail.phpのページプロパティでエンコーディングはUTF-8になってます。(DWで確認できました) またプログラムの中にも以下の記述があり、指定しているつもりです。 // フォームHTMLの文字エンコードを設定する場合(sjis/euc-jp/utf-8) // ※設定しない場合 sfm_form.html の文字エンコードに合わせます $baseEnc = 'utf-8'; >出力されたHTMLのヘッダのcharset sfm_confirm.htmlにも、sfm_form.htmlにも以下の記述をしています。 <meta charset="UTF-8"> >修正について mbから始まる三つの記述に関しては、sformmail.phpの先頭に入れました。 もう一文に関しては、sfm_confirm.htmlに↓の通り足しました。 <h4> <?php header('Content-Type: text/html; charset=utf-8'); echo $sfm_submit; ?> <?php $this->crCheck(); ?> </h4> しかし文字化けのボタンの上に、以下の警告文が出てしまいました。 Warning: Cannot modify header information - headers already sent by (output started at /home/〜ドメイン名〜/www/contact/sfm_confirm.html:47) in /home/〜ドメイン名〜/www/contact/sfm_confirm.html on line 168 そこで調べたところ、sfm_confirm.htmlの47行目よりの前にかけばいいと思い、46行目に以下の文を足しました。 <php? header('Content-Type: text/html; charset=utf-8'); ?> けれど変わりがなく、ソースを確認すると上の文が、そのままHTMLのタグの中にそのまま残っていました。 色々調べたのですが、<head>内に書いたりしても変わらず、上手くいきません。初歩的な質問で申し訳ないですが、こちらの文はどこにどのように足したら良いのでしょうか? ちなみに47行目は↓です。 <form method="post" name="sfm-form" id="sfm-form" action="<?php echo $sfm_script; ?>">
zico_teratail

2016/11/08 02:42

「headers already sent」との警告文どおりです。 もう既にヘッダが送信されてるから不要ですよ、ということなので、 header~ は削除してください。
NP3228

2016/11/08 02:47

なるほど、ありがとうございます。 しかしmbから始まる3行だけでは、全く変わらず解決できなかったみたいです。 何か他に考えられることがあれば、ご教授お願いします。 何か確認するものがあれば、初心者なので時間がかかるかもしれませんが、確認しますので!
zico_teratail

2016/11/08 02:54

>挙動が乱れるのを恐れて、あまり触らないようにしてます。 もう既に乱れてるのですから、私が提案した input typeの二行の変更(配列を使わずに直接テキストを書く) を実施してみてください。
NP3228

2016/11/08 03:04 編集

ご指摘の通りしてみましたが、変わらないですね。 <修正↓> $submit = <<< EOD <p>入力が正しければ、送信ボタンを押してください。</p> <input type="hidden" name="mode" id="mode" value="SEND" /> <input type="submit" name="submit" id="submit" value="送 信" /> <input type="button" name="back" id="back" value="戻 る" onclick="history.back()" /> EOD; <結果↓> <h4><p>?ュ????罩c???????違????篆<???帥?潟???若?????????????</p> <input type="hidden" name="mode" id="mode" value="SEND" /> <input type="submit" name="submit" id="submit" value="????篆? /> <input type="button" name="back" id="back" value="?祉????" onclick="history.back()" /> </h4> 一体、何がどうなっているのでしょう・・・ややこしい問題ですみません・・・
guest

0

あとはもうsformmail.phpのソース全文と、出力されたHTMLの全文がないと判断できませんね。

投稿2016/11/08 03:59

zico_teratail

総合スコア907

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NP3228

2016/11/08 07:00

sformmail.phpは、下記から取ることができます。 http://www.sapphirus.biz/php/sformmail2/ confirm.htmlは長文となり、すみませんが以下の通りとなります。 <!DOCTYPE html> <html lang="jp"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>タイトル</title> <link rel="stylesheet" href="../cssjs/bootstrap.css"> <body background="../img/bg/cnt.jpg"> <div class="row" id="cnt"> <form method="post" name="sfm-form" id="sfm-form" action="<?php echo $sfm_script; ?>"> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>資料送付</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-8"><h4> <div class="col-4"><?php echo $sfm_html->siryo; ?></div> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>相談会</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-8"><h4> <div class="col-4"><?php echo $sfm_html->date; ?></div> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>お名前(ご本人)</h4> </div> <div class="col-1"> <div class="hiss">必須</div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-5"><h4> <div class="col-4"><?php echo $sfm_html->name; ?></div> <div class="col-4"><?php echo $sfm_html->seibetu; ?></div> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>ふりがな</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-5"> <?php echo $sfm_html->ruby; ?> </div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>年齢・学年</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-5"><h4> <?php echo $sfm_html->age; ?>歳  <?php echo $sfm_html->gakunen; ?> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>参加者</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-5"> <h4> <?php echo $sfm_html->sanka; ?> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>住所</h4> </div> <div class="col-1"> <div class="hiss">必須</div> </div> <div class="col-xs-12 col-sm-8 col-md-8 col-lg-8"><h4> 〒<?php echo $sfm_html->address1; ?> <?php echo $sfm_html->address2; ?><?php echo $sfm_html->address3; ?> <?php echo $sfm_html->address4; ?> </h4> </div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>TEL</h4> </div> <div class="col-1"> <div class="hiss">必須</div> </div> <div class="col-xs-12 col-sm-5 col-md-5 col-lg-5"><h4> <?php echo $sfm_html->tel; ?> </h4> </div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>関心事</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-8 col-md-8 col-lg-8"><h4> <?php echo $sfm_html->info1; ?> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>タイプ</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-8 col-md-8 col-lg-8"><h4> <?php echo $sfm_html->info2; ?> </h4></div><div class="clearfix"></div> <div class="col-xs-11 col-sm-3 col-md-3 col-lg-3 cntnth"> <h4>質問</h4> </div> <div class="col-1"> <div class="hiss"></div> </div> <div class="col-xs-12 col-sm-8 col-md-8 col-lg-8"><h4> <?php echo $sfm_html->situmon; ?> </h4></div><div class="clearfix"></div> <div align="center"> <h4><?php echo $sfm_submit;?> <?php $this->crCheck(); ?></h4> </div> </form> </div> </body></html>
zico_teratail

2016/11/08 11:34

ikedasさんの指摘通り、このsformmail2にこだわるよりも他の新しいものに乗り換えたほうが早いかと思われます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問