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

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

ただいまの
回答率

90.51%

  • PHP

    24054questions

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

  • HTML

    11503questions

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

  • 文字コード

    235questions

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

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

受付中

回答 4

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,091

NP3228

score 6

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

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

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

// submit表示項目
function printSubmit($error)
{

    // 送信/戻るボタン表示設定
    $button_text = array(
        'send'    =>"送 信"
    ,    'back'    =>"戻 る"
    );

    if ($error == 1) {
        // エラーがある場合のHTML出力
        $submit = <<< EOD
<p class="ERR">必須項目の入力に不足があります。</p>
<input type="button" name="back" id="back" value="{$button_text['back']}" onclick="history.back()" />
EOD;
    } else {
        // 項目が正しい場合のHTML出力
        $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>

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

<修正↓>

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


<結果↓>
イメージ説明

<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="ASCII" onclick="history.back()" />
</h4>

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

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

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

<h4>
<!--修正前:<?php echo $sfm_submit; ?> <?php $this->crCheck(); ?>-->
<?php echo mb_convert_encoding($sfm_submit, "utf-8", "auto"); ?> <?php $this->crCheck(); ?>
</h4>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+3

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


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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

mb_language("ja");
mb_internal_encoding("UTF-8");
mb_language("Japanese");


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/08 10: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>

    キャンセル

  • 2016/11/08 10: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の基礎的な知識から勉強されたほうが良さそうですね・・・

    キャンセル

  • 2016/11/08 11: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; ?>">

    キャンセル

  • 2016/11/08 11:42

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

    キャンセル

  • 2016/11/08 11:47

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

    キャンセル

  • 2016/11/08 11:54

    >挙動が乱れるのを恐れて、あまり触らないようにしてます。

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

    キャンセル

  • 2016/11/08 12:03 編集

    ご指摘の通りしてみましたが、変わらないですね。
    <修正↓>
    $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>

    一体、何がどうなっているのでしょう・・・ややこしい問題ですみません・・・

    キャンセル

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/08 17:42

    エディタですが、html、php共にDreamweaverCCを使っています。

    DreamweaverCCの、[修正]ー[ページプロパティ]ー[タイトル/エンコーディング]で確認する限り、エンコーディング:Unicode(UTF-8)となっています。

    さくらインターネットのファイルマネージャーでも確認がとれましたが、やはりUTF-8となっています。補足ですが、改行が「LF」種類でした。
    何か、他に確認する点などあれば、お願いします。

    キャンセル

  • 2016/11/08 17:53

    すみません、zico_teratailさんが既に指摘されていましたね。

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/11/08 16: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>

    キャンセル

  • 2016/11/08 20:34

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

    キャンセル

同じタグがついた質問を見る

  • PHP

    24054questions

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

  • HTML

    11503questions

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

  • 文字コード

    235questions

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