- ベストアンサー
文字化けについて
お世話になります 携帯サイトの文字化けに困っています。 MysqlのデータはEUC-JPなので 携帯サイトにデータを出力するのにShift-JSにしないと文字化けするというところまで調べました。 function cnv_dispstr($string) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, "Shift-JIS,EUC-JP"); if ($det_enc and $det_enc != ENCDB) { return mb_convert_encoding($string, ENCDB, $det_enc); } else { return $string; } } このようにしたのですが、 Mysqlから出力したデータ部分の文字化けが解決しません。 アドバイスよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
mbstring.internal_encoding=EUC-JP ところでphpのソースファイルはEUC-JPで保存してますよね?これを間違ってると結局文字化けの嵐にしかならないので。 あと、SQLサーバーの方の文字コードもEUC-JPなら、SQLサーバーとのデータやりとりに文字コード変換は必要無いと思いますけど、一応そちらも確認して下さい。 mbstring.http_output = SJIS php.iniでこの設定になっているのなら、PCに対しても携帯に対しても、ページ出力はみなShift-JISとしてしまうのが面倒がなさそうですね。 metaタグのcharset記述は、Shift_JISにしておきましょう。 この場合、先に示したマニュアルの、「例 3. SJIS ユーザ用の php.iniの 設定」のとおりになっているかをすべて確認して下さい。
その他の回答 (3)
- hrm_mmm
- ベストアンサー率63% (292/459)
>携帯サイトにデータを出力するのにShift-JS ページ出力全部がShift-JISである必要があります。 SQLから取り出したデータは、スクリプトの記述用文字コード(mbstring.internal_encoding)にまず変換しておけば、 そのあと、mbstring.http_output = SJIS; で、ページ全体がShift-JISに変換されます。 >PCサイトと携帯サイトの両方に ページ別に出力文字コードを変更する必要があるわけですね。 php.iniでの出力用文字コード設定は、一つしかできませんので、 「ob_start() で ob_start のコールバック関数として mb_output_handler() を指定する」 方法を取る必要があるでしょう。 頑張って、マニュアル読んで下さい。
お礼
すみません、教えてください。 php.iniを開いてみました。 mbstring.internal_encoding = EUC-JP mbstring.http_output = SJIS になっています。 output_handler = mb_output_handler ↑このようにしました。 あとは携帯ページの方をすべて Shift-JISで統一しておいた方が良いのでしょうか。 よろしくお願いします。
補足
ご回答有難うございます。 今、マニュアルも読みながら頑張っています。 まだ良くわからない状態ですので、 少し時間がかかると思いますがちょっとでも進めば報告させてください。 すみませんが見捨てないで覗いてやって頂けると嬉しいです。 よろしくお願いします。
- php504
- ベストアンサー率42% (926/2160)
確認はPCでされているのでしょうか 文字化けはshift jisがeuc-jpで表示されているのかeuc-jpがshift jisで表示されているのかどっちでしょうか ブラウザのエンコードを変えて確認してください それとphpinfo()でmbstringの設定を確認して教えてください
お礼
再度有難うございますm(_ _)m 確認はPCと携帯3機種で行いました。 色々とeuc-jp、shift-jisと部分的に変えて見たりもしました。 ファイルがたくさんあるので、その設定による文字化けの原因が異なります。ファイルごとの設定と一緒にお知らせします。 --------------------------------------- date.php(euc) |(PC) |(ktai) sup.php(euc) sup3.php(euc) sup.html(euc) sup3.html(shift) | | form.php(euc) form3.php(euc) sin.html(euc) sin3.html(shift) | | sincon.html(euc) sincon3.html(shift) | | end.html(euc) end3.html(shift) -------------------------------------------- 現在この状態で、DBから呼び出したデータの部分のみ euc-jpがshift-jisで表示されている為文字化けしていると思います。 携帯の方のphpファイルをshift-jisにすると、全体が化けてしますので、eucとshift-jisと混在する形になっています。 先の御礼の欄で書いたソースは、 PCと携帯それぞれのsup.php、form.php 計4ファイルに入っています。 設定の部分は一番上のdate.phpにのみ入っています。 phpinfo()のmbstringの設定確認ですが、すみません、まだphp1ヶ月の初心者なのでよくわかりませんでした。 環境は、ロリポップのレンタルMysqlを使用です。 ブラウザ上でphpinfo()のページを開いてみましたが何も設定されていなさそうな雰囲気でした。 使い方が間違ってるようにも思います(T▽T) どうぞよろしくお願いします。
補足
すみません、mbstringの設定ですが 多分これだと思います Multibyte Support enabled Japanese support enabled Simplified chinese support enabled Traditional chinese support enabled Korean support enabled Russian support enabled Multibyte (japanese) regex support enabled mbstring.detect_order no value no value mbstring.encoding_translation Off Off mbstring.func_overload 0 0 mbstring.http_input pass pass mbstring.http_output pass pass mbstring.internal_encoding no value no value mbstring.language Japanese Japanese mbstring.script_encoding no value no value mbstring.substitute_character no value no value 補足・御礼の順番がむちゃくちゃなのですが、 このレスが最新です。 現在は ---------------------------------- function cnv_dispstr($string) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, "SJIS"); if ($det_enc and $det_enc != ENCDB) { return mb_convert_encoding($string, $det_enc); } else { return $string; --------------------------- ↑この状態で、ページ全てが文字化けしていたのが 一部(3箇所ほど)文字化けに減りました。 同じ文字のDB出力部分で"円"が円で表示される部分とア゜になる所とあります。同じ 円 なのにどうしてなのでしょうか。 英数字は正常に表示されています。 かな・漢字の一部が化けています。 試しにフォーム内容を送信してみると DBの文字が化けるようになりました(涙) 送信時の文字もshift-jisになってしまったのですよね、きっと。 ヒントだけでも結構ですので、 アドバイスよろしくお願いします。
- php504
- ベストアンサー率42% (926/2160)
文字コードがわかっているなら $string = mb_convert_encoding($string, "sjis", "euc-jp"); と明示した方が誤判定も防げると思います。
お礼
ご回答有難うございます。 $string = mb_convert_encoding($string, "sjis", "euc-jp"); とか $string = mb_convert_encoding($string, "sjis ,euc-jp"); とか $string = mb_convert_encoding($string, "euc-jp,sjis"); とか 思いつく限り並べ方を変えたりShift-JIS←→SJISに変えてみたのですが、解決しませんでした。 他の所に原因があるのでしょうか? PCサイトと携帯サイトの両方に同じDBからデータを取り出したいのですが、PCはEUCで、携帯はSjift-JISで、というようにしたいです。 設定は ----------------------------- //表示文字コード define("ENCDISP", "EUC-JP"); //データベース文字コード define("ENCDB", "EUC-JP"); ----------------------------- ↑になってます。 もしよろしければ、再度ご回答頂けると有難いです。 あつかましいお願いですがよろしくお願いします。
お礼
再度ご回答有難うございます。 お騒がせしています。 >ところでphpのソースファイルはEUC-JPで保存してますよね? NO.2様の御礼の欄に書いた時は、()内の状態で保存していました。 それを全てEUC-JPで保存し直して、 metaのcharasetをShift_JISにしましたが、 どうしても文字化けは改善しませんでした。 もう何をやってもダメだ!!とヤケになって、 charasetもEUC-JP、なにもかもEUCで統一したところ あっさりとキレイに表示されました。 3キャリア(i-mode,au,vodafone)で確認してもばっちりでした。 一緒に考えて下さって本当に有難うございました。 まさか、自分で解決できるなんて思ってませんでした。 ところで、どこをどんなに調べても携帯はShijt-JISが当たり前だと思っていたのですが、EUC-JPで何故通用してしまったのでしょうか。謎だらけです・・・。