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

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

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

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

Q&A

解決済

2回答

4058閲覧

フォームの半角カナの変換後の文字化け(windows)

OndaSeiko

総合スコア14

PHP

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

0グッド

0クリップ

投稿2017/07/01 04:49

下記の質問を経て、MAMP環境では、mb_convert_kanaを使った変換が正しく動作したのですが、
https://teratail.com/questions/82333
実際のサーバにアップし、windowsで動作確認したところ、入力画面で半角カナ入力すると、確認画面で文字化けしてしまいました。

mb_convert_kanaの記述を加える前は、当たり前ですが、半角カナを入力すると該当箇所は「??」で表示されていましたが、当該コードを加えたら、別の化け方になりました。

文字コード周り(記述場所、指定方法)が原因なのかとも考えましたが、見当がつかなくなってしまいました。
何かしらご指摘いただけると助かります。

php

1<?php 2 3//変数の初期化 4$page_flag = 0; 5$clean = array(); 6$error = array(); 7 8// サニタイズ 9if( !empty($_POST) ) { 10 11 foreach( $_POST as $key => $value ) { 12 $clean[$key] = htmlspecialchars( $value, ENT_QUOTES); 13 } 14} 15 16if( !empty($_POST['btn_confirm']) ) { 17 18 //半角・全角の変換 19 //この1行を加えました 20 $clean['toiawase'] = mb_convert_kana($clean['toiawase'],"SKV"); 21 22 23 $error = validation($clean); 24 25 if( empty($error) ) { 26 $page_flag = 1; 27 } 28 29} elseif( !empty($_POST['btn_submit']) ) { 30 31 $page_flag = 2; 32 //変数とタイムゾーンを初期化(省略) 33 34 //言語と文字コードの使用宣言 35 mb_language("ja"); 36 mb_internal_encoding("UTF-8"); 37 38 //メールの設定各種(省略) 39} 40function validation($data) { 41 42 $error = array(); 43 44 // バリデーション 45 if( empty($data['toiawase']) ) { 46 $error[] = "「お問合せ」は必ず入力してください。"; 47 }elseif( 400 < mb_strlen($data['toiawase']) ) { 48 $error[] = "「お問合せ」は400文字以内で入力してください。"; 49 } 50 return $error; 51} 52?> 53<!DOCTYPE html> 54<html lang="ja"> 55<head> 56 <!-- head省略 --> 57</head> 58<body> 59 <!-- html省略 --> 60<?php if( $page_flag === 1 ): ?> 61 62 <form method="post" action=""> 63 <dl class="form"> 64 <dt>お問合せ内容 <span class="red"></span></dt> 65 <dd><?php echo nl2br($clean['toiawase']); ?></dd> 66 </dl> 67 <div> 68 <input type="submit" name="btn_back" value="戻る" class="btn_gr"> 69 <input type="submit" name="btn_submit" value="送信" class="btn_bl"> 70 <input type ="hidden" name="toiawase" value="<?php echo $clean['toiawase']; ?>"> 71 </div> 72</form> 73 74<?php elseif( $page_flag === 2 ): ?> 75 <!-- 送信完了画面の記述 --> 76 77<?php else: ?> 78 <form method="post" action=""> 79 <dl class="form"> 80 <dt>お問合せ内容 <span class="red"></span></dt> 81 <dd><textarea name="toiawase" rows="5"><?php if( !empty($clean['toiawase']) ){ echo $clean['toiawase']; } ?></textarea></dd> 82 </dl> 83 <div> 84 <input type="submit" name="btn_confirm" value="入力内容を確認する" class="btn_bl"> 85 </div> 86 </form> 87 <?php endif; ?> 88 89</body> 90</html>

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

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

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

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

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

miyahan

2017/07/01 05:01

このアプリはすべてUTF-8環境でしょうか?また文字化けが発生したサーバーのOS(CentOS等)・Webサーバー(Apache2.4等)・PHPバージョンを教えてください。
OndaSeiko

2017/07/01 05:27

ウェブページを作成しています。サーバはGMOのiCLSTAで、OSはLinux(ver.非公開)WebサーバはApache2.4 をベースとしたカスタムバージョン。PHPは5.6です。
miyahan

2017/07/01 05:39

サーバーのmbstring設定を見たいです。"<?php phpinfo(); ?>" だけ書いたPHPファイルをサーバーにアップロードしアクセスしてください。設定一覧が表示されるので、mbstring.encoding_translation、mbstring.http_input、mbstring.http_output、mbstring.internal_encoding、mbstring.language の値を教えて下さい
OndaSeiko

2017/07/01 05:59

phpiniの設定ですね!mbstring.encoding_translationはLocal,MasterともにOn、mbstring.http_inputはともにno value、mbstring.http_outputもともにno value、mbstring.internal_encodingがともにEUC-JP、mbstring.languageがともにneutralでした。
OndaSeiko

2017/07/02 01:39

文字化けの要因になるphpの設定箇所がどれなのか、明確になりました。ありがとうございます。
guest

回答2

0

ベストアンサー

mbstring の内部文字コードが EUC-JP であるために文字化けが起きているようです。

コード中、mb_internal_encoding() で設定を行っていますが submit するときにしか呼ばれないため confirm 時の文字化けを防げていません。

ですので、mbstring の設定をすべてのPHPファイルの最初に書き、常に呼ばれるようにしましょう。

php

1<?php 2//言語と文字コードの使用宣言 3mb_language("ja"); 4mb_internal_encoding("UTF-8"); 5 6//変数の初期化 7$page_flag = 0; 8...

ところで最初に一律で htmlspecialchars() を行っていますが、入力値のエスケープは出力する際に行うのが原則です。

htmlspecialchars() はその名の通り HTML 用のエスケープを行うため、いまのままだとEメール内の一部記号が正しく表示されません。

HTMLの出力のほかに、コマンドを実行する際、データベースにアクセスする際にもそれぞれの方法で値のエスケープが必要になってきますので、今後は「必要なときにそれに見合った方法でエスケープ」を意識してください。

投稿2017/07/01 06:29

miyahan

総合スコア3095

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

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

OndaSeiko

2017/07/02 02:35

文字化けの件については、記述順を変更したことで解消しました。 htmlspecialchars()の件についても、説明ありがとうございます。 「一律で処理せずに」と言う点に関しては、foreachですべての項目を一律で処理せずに下記のように必要な項目に関して個別に行う(textareaとtextboxには必須と習ったので、逆に言うとラジオボタンなどは不要)方が適切、ということでしょうか? // サニタイズ if( !empty($_POST) ) { $clean['toiawase'] = htmlspecialchars($clean["toiawase"],ENT_QUOTES); $clean['namae'] = htmlspecialchars($clean["namae"],ENT_QUOTES); $clean['kana'] = htmlspecialchars($clean["kana"],ENT_QUOTES); } それでもこの状態は、出力時ではなく、入力された値に対する処理だと思うので、処理のタイミングが違う、ということでしょうか?
miyahan

2017/07/02 02:52

タイミングの話です。HTMLを出力する際にエスケープすべきなので、 <?php if( !empty($clean['toiawase']) ){ echo $clean['toiawase']; } ?> を <?php if( !empty($_POST['toiawase']) ){ echo htmlspecialchars($_POST['toiawase'], ENT_QUOTES, 'UTF-8'); } ?> とします。やや不恰好ですが…。 ラジオボタンやチェックボックスはユーザーからの入力値を表示することは無いはずなので、エスケープは不要(というかするタイミングがない)と思います。
OndaSeiko

2017/07/03 00:43

具体的に書いていただき、ありがとうございます。理解できました。
guest

0

iCLUSTAの使い方なので、プログラムと言えるかどうか・・・

PHPのデフォルトの値はどのように確認しますか?

まずはここに従って文字コードを確認なさってください。

追記

同じディレクトリに、php.iniを配置し、中身を

mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = pass ```としてみてください。

投稿2017/07/01 05:37

編集2017/07/01 08:10
shi_ue

総合スコア4437

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

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

OndaSeiko

2017/07/01 06:27

サーバの設定の問題のようですね。
OndaSeiko

2017/07/02 02:48

「php.iniファイルを独自に設置できますか?」 のページは確認できていたのですが、具体的な書き方がわらかなかったので、大変助かりました。 mbstringの記述場所を変更したことで、今回質問した問題点は解消したのですが、基本的な考え方として、php.iniファイルが独自に設定できる環境ならば、文字コードを指定しておいた方が確実に文字化け防げるので良い、ということであっていますか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問