- ベストアンサー
PHP フォームからのデータが文字化け
PHPにて簡単な以下のようなアプリを勉強がてら作っています。 1.登録フォームを表示 2.確認画面表示 3.DB(MySQL)にデータ登録 そこで質問なのですが、フォームから入力し確認画面を表示するときに、フォームから入力した文字が文字化けしてしまいます(正確には文字化けする時としない時があります)。 出力ページはSmartyを使っています。 テンプレートはUTF-8を使っており、テンプレート内の文字は文字化けしません。PHPソースもUTF-8で書いてあります。 各PHPソースには mb_language("uni"); mb_internal_encoding("UTF-8"); mb_http_output("UTF-8"); と記述しています。 DB(MySQL)のテーブルはUTF-8にしてあります。 1点気になるのは、某ホスティングサービス上で作っているのですが、PHPinfoで見てみるとmb_internal_encodingはEUC-JPになっています。 今回UTF-8で作りたいのですがどうしたら良いのでしょうか? 環境は、 Apache 1.3.34 / PHP 4.3.7 / MySQL 4.1.21 です。 アドバイスお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
誤った文字コードでPOSTされる・・というのは過去にブラウザのバグなどでいくつか散見した気がします。そういう可能性は捨てきれないですね。 mb_detect_encodingでutf-8でなかったら、その文字コードからutf-8へ変換するようにしたほうが確実でしょう。私もたまに「文字コードチェック用」のhidden項目をformに追加したりします(確実に判別できる日本語をPOSTさせてチェックする)。
その他の回答 (3)
- wp_
- ベストアンサー率54% (132/242)
>10回に1回程度 と言うのが不可解ですね。。 その現象の原因でよくあるパターンとしては ・ロードバランサなどを使用し負荷分散しているが、全サーバの同期が取れていない →ホスティングサーバ側の問題なので如何ともしがたい ・クライアント側の設定の問題 →ie5世代はF5連打したときhttpクエリがたまに崩れた記憶が。 ・httpヘッダに記述がないせいでブラウザが文字コードを正しく認識していない →php側でheader('content-type:text/html;charset=""UTF-8');と記述しましょう くらいですかね。 telnetなどで連打し、取得したhttpクエリがたまに変化してたりしないか見ると良いかもしれません。 >$enc = mb_detect_encoding(); >if($enc != "UTF-8") $str = mb_convert_encoding ($str,"UTF-8",$enc); 変換方法としてはそれで合っています。
お礼
ありがとうございます。 色々やっているうちに根本的なことが理解できていないことに気付きました。 今回教えていただいたことを頭に入れ、再度新しい質問で質問させていただきます。 お手数をおかけいたしました。
- shimix
- ベストアンサー率54% (865/1590)
No.1の方に補足ww mb_internal_encodingはPHP_INI_ALLですから、.htaccessで設定可能ですね(サーバがディレクトリごとのphp.iniを有効にしていればそちらでも可)。 http://www.php.net/manual/ja/ini.php .htaccessに php_value mb_internal_encoding "UTF-8" と書いて、phpinfo()でlocal_valueを確認してください。
お礼
ありがとうございます。 やはり、.htaccessに記載しないとダメなのでしょうか。。 今自分なりに調べてみたのですが、フォームからの(POSTで受け取っています)データをmb_detect_encodingで調べてみたのですが、UTF-8になる時と(文字化け無し)、EUC-JPになる時(当然文字化け)があります。 教えて頂いたとおり.htaccessに記載すれば直るのでしょうか。 ....やってみます。。
補足
やってみました。 PHPファイルのあるディレクトリに教えて頂いた.htaccessを置いてみました。 結果、 phpinfo()のmb.internal.encodingはUTF-8で変わらず。 10回に1回程度、EUC-JP(文字化けする)になってしまいます。 引き続きアドバイス頂きたいです。
- wp_
- ベストアンサー率54% (132/242)
>(正確には文字化けする時としない時があります)。 予測ですが、MIMEをきちんと指定してやると解消されると思います。 httpのヘッダ、metaタグ、出力する文字など適切に処置しましょう。 >今回UTF-8で作りたいのですがどうしたら良いのでしょうか? .htaccessで明示的に指定しましょう。 設定の仕方は他の人に期待(終電がぁー
お礼
ありがとうございます。 HTML(テンプレート)には <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> と記述しています。 .htaccessに記載しないとダメなのですかね。 他のサーバーにも使いたいので、毎回.htaccessを弄るのも。。
お礼
ありがとうございます。 まず訂正です。先程投稿しました「やってみました・・・」の中で、 「phpinfo()のmb.internal.encodingはUTF-8で変わらず。」は 「phpinfo()のmb.internal.encodingはEUC-JPで変わらず。」の間違えです。 回答いただきました内容ですが、 $enc = mb_detect_encoding(); if($enc != "UTF-8") $str = mb_convert_encoding ($str,"UTF-8",$enc); といった事で対応する感じで良いのでしょうか?