- ベストアンサー
携帯向けフォームの文字化け
過去の事例で色々と対処してみたのですが、一向に解決しませんのでご質問させて頂きます。 環境はUbuntu8 Apache2 PHP5.2.4 UTF-8で作成しています。 オーダー、お問い合わせの処理の部分で、どうしても確認画面、送信で携帯の方だけが文字化けしてしまいます。(PC、ローマ字は問題ありません) PCと携帯サイトはphp自体は同じ物を見ていて、読み込むテンプレートと、一部エンコード処理、metaなどを分けている状態です。 対処した事としましては、 apache2のphp.iniの設定を以下いじりました。 mbstring.encoding_translation = On mbstring.http_input = auto mbstring.internal_encoding = UTF-8 そしてphp処理内(携帯のみ)で、 mb_http_output("SJIS"); ob_start("mb_output_handler"); としています。 phpinfoで確認しました所、上記設定で反映されております。 勿論ページは問題なく表示されているのですが、フォームに打ち込まれる日本語がうまくエンコードされません。 フォームから飛ばしたPOSTを、 $_POST=mb_convert_encoding($_POST,"SJIS","UTF-8"); 等とすると、日本語を何を入力しても「A」とだけ表示され、上記を省いても空か、「xyz」などとなります。 実際にはlolipopのレンタルサーバーに上げて動作させたいのですが、上げた物も同じ動きをします。 何か穴がありましたらご教示頂けませんでしょうか?よろしくお願い致します!
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>とりあえず$_POSTを何らかの配列にしてmb_convertに渡しても変化なしでした・・・ マニュアルでmb_convert_encodingの使い方をよく読んでください。第一引数はarrayではなくstringと指定されていますよ。 基本的なことを知らずに開発しているようなので、一度マニュアルを熟読されてはどうでしょうか。 http://www.php.net/manual/ja/ また、携帯も対応させる目的で出力エンコードをSJISにするのであれば、テンプレートをSJISで記述して出力されるようにするほうが賢明です。なぜUTF-8なのでしょうか?
その他の回答 (2)
- tany180sx
- ベストアンサー率63% (239/379)
だらだらと蛇足 PHPがUTF-8で出力がSJISでmb_output_handlerがONなら テンプレートはUTF-8でいいと思いますけど。 mbstring.encoding_translation = On mbstring.http_input = auto ならリクエスト値は自動で変換されるので基本的には変換作業は必要ありません。 ただし、detect_order が auto だと誤変換することもしばしあります。 一応配列用の文字コード変換関数もあります。 mb_convert_variables() lolipopなどのレンサバだと入力値自動変換はオフになってますので .htaccess で設定しないと機能しません。 もしxhtmlのヘッダーを出力してXHTML対応するなら mb_output_handlerは動作しません。
お礼
更に詳しくありがとうございます! 大変勉強になります! どうやら間違った解釈をしてしまっていたらしく、 コンバートをUTF-8からSJISにしていたのを、 SJISからUTF-8にしましたら、正常に変換されました! 自動でSJISに書き出されるから、内部ではUTF-8に揃えておけよという事なんですね(^^; detect_orderは何だか挙動が不安定だなと思っておりましたら、 そういう事なんですね・・・ 配列用の変換があることには気づきませんでした! ご親切にありがとうございます! 更に、xhtmlでコーディングしているので、こちらも気をつけます。 補足頂いた内容を見まして、何だかちょっとスッキリしました。 なるほどそういう事だったのかと・・・ 勉強不足故に色々とお手間おとりしまして申し訳ないと共に、 お二方には感謝でいっぱいです。ありがとうございます!
- cyanberry
- ベストアンサー率50% (117/230)
>$_POST=mb_convert_encoding($_POST,"SJIS","UTF-8"); $_POSTは配列のスーパーグローバル変数なので、string型を引数にするmb_convert_encodingに渡すとエラーになりそうなのですがエラー出てませんか? $_POSTに値を代入する行為もあまり良くありません。 そもそもページのエンコードはSJISなんですよね?であればエンコードUTF-8→SJISのエンコード自体必要なくないですか? テンプレートはSJISで書いてますか?テンプレートと出力しようとしている文字列のエンコードは一致していますか? 情報が少ないので何とも言えませんが、おそらく簡単な問題かと思います。
補足
早速のご回答ありがとうございます! $_POSTに関しまして、 なるほど、この使い方は良くないのですね・・・勉強になります。 とりあえずブラウザではエラーは出ていないようです。 PHP自体のエンコーディングがUTF-8だからなのか、テンプレ自体をSJISにしてしまうと、文字化けしてしまいました。 PCはテンプレも全てUTF-8で作成しております。なので携帯もUTF-8で書いてありまして、それをアウトプット時にSJISにしている状態です。 とりあえず$_POSTを何らかの配列にしてmb_convertに渡しても変化なしでした・・・
お礼
おっしゃる通りでした…勉強不足でご迷惑お掛け致しました。 テンプレ自体をShift_JISにし、モバイルのみの設定でinternal_encodingをShift_JISにすることで何とかShift_JISを正常に表示出来そうです。 PHP内で変数に入れてしまっている日本語部分はmb_convert_encodingで対処出来そうです。 色々と勉強になりました。ありがとうございました!