• ベストアンサー

文字化けについて

お世話になります 携帯サイトの文字化けに困っています。 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から出力したデータ部分の文字化けが解決しません。 アドバイスよろしくお願いします。

  • PHP
  • 回答数4
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.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の 設定」のとおりになっているかをすべて確認して下さい。

chiezou-yon
質問者

お礼

再度ご回答有難うございます。 お騒がせしています。 >ところでphpのソースファイルはEUC-JPで保存してますよね? NO.2様の御礼の欄に書いた時は、()内の状態で保存していました。 それを全てEUC-JPで保存し直して、 metaのcharasetをShift_JISにしましたが、 どうしても文字化けは改善しませんでした。 もう何をやってもダメだ!!とヤケになって、 charasetもEUC-JP、なにもかもEUCで統一したところ あっさりとキレイに表示されました。 3キャリア(i-mode,au,vodafone)で確認してもばっちりでした。 一緒に考えて下さって本当に有難うございました。 まさか、自分で解決できるなんて思ってませんでした。 ところで、どこをどんなに調べても携帯はShijt-JISが当たり前だと思っていたのですが、EUC-JPで何故通用してしまったのでしょうか。謎だらけです・・・。

その他の回答 (3)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

>携帯サイトにデータを出力するのにShift-JS ページ出力全部がShift-JISである必要があります。 SQLから取り出したデータは、スクリプトの記述用文字コード(mbstring.internal_encoding)にまず変換しておけば、 そのあと、mbstring.http_output = SJIS; で、ページ全体がShift-JISに変換されます。 >PCサイトと携帯サイトの両方に ページ別に出力文字コードを変更する必要があるわけですね。 php.iniでの出力用文字コード設定は、一つしかできませんので、 「ob_start() で ob_start のコールバック関数として mb_output_handler() を指定する」 方法を取る必要があるでしょう。 頑張って、マニュアル読んで下さい。

参考URL:
http://php.s3.to/man/ref.mbstring.html
chiezou-yon
質問者

お礼

すみません、教えてください。 php.iniを開いてみました。 mbstring.internal_encoding = EUC-JP mbstring.http_output = SJIS になっています。 output_handler = mb_output_handler ↑このようにしました。 あとは携帯ページの方をすべて Shift-JISで統一しておいた方が良いのでしょうか。 よろしくお願いします。

chiezou-yon
質問者

補足

ご回答有難うございます。 今、マニュアルも読みながら頑張っています。 まだ良くわからない状態ですので、 少し時間がかかると思いますがちょっとでも進めば報告させてください。 すみませんが見捨てないで覗いてやって頂けると嬉しいです。 よろしくお願いします。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

確認はPCでされているのでしょうか 文字化けはshift jisがeuc-jpで表示されているのかeuc-jpがshift jisで表示されているのかどっちでしょうか ブラウザのエンコードを変えて確認してください それとphpinfo()でmbstringの設定を確認して教えてください

chiezou-yon
質問者

お礼

再度有難うございます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) どうぞよろしくお願いします。

chiezou-yon
質問者

補足

すみません、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)
回答No.1

文字コードがわかっているなら $string = mb_convert_encoding($string, "sjis", "euc-jp"); と明示した方が誤判定も防げると思います。

chiezou-yon
質問者

お礼

ご回答有難うございます。 $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"); ----------------------------- ↑になってます。 もしよろしければ、再度ご回答頂けると有難いです。 あつかましいお願いですがよろしくお願いします。

関連するQ&A

  • 携帯の文字化け

    パソコンで入力したお知らせをパソコンと携帯で確認できるようにしたものを、サーバーを移管したところ、携帯で見る方だけ文字化けをおこすようになりました。 <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> です。 // 表示文字コード define("ENCDISP", "shift_jis"); // データベース文字コード define("ENCDB", "EUC-JP"); // ========================================================= // 表示する文字コードに変換 // ========================================================= function cnv_dispstr($string) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, "EUC-JP, SJIS"); if ($det_enc and $det_enc != ENCDISP) { return mb_convert_encoding($string, ENCDISP, $det_enc); } else { return $string; } } ちなみにこういうのを入れてみてもだめでした。 すいませんが教えてください。

    • 締切済み
    • PHP
  • 文字化け

    文字コードをEUCにて統一しているにも関わらず、 結果画面をみると下記のように化けてしまいます。 原因を教えて頂きたく思います。 よろしくお願いします。 データを表示する ID 名前 出身 年齢 1 ???? ??? 30 2 ???? ??? 20 <html> <head> <title>データを表示する</title> </head> <body> <h3>データを表示する</h3> <?php // 表示文字コード $disp_enc = "EUC-JP"; // データの文字コードを変換する関数 function cnv_dbstring($string, $enc) { // 文字コードを変換する $det_enc = mb_detect_encoding($string); if ($det_enc and $det_enc != $enc) { return mb_convert_encoding($string, $enc, $det_enc); return mb_convert_encoding($string, $enc, $det_enc); } else { return $string; } [DB接続部分省略] // 取り出したデータを表示する echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>名前</td>"; echo "<td>出身</td>"; echo "<td>年齢</td>"; echo "</tr>"; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".cnv_dbstring($row["nam"], $disp_enc)."</td>"; echo "<td>".cnv_dbstring($row["pre"], $disp_enc)."</td>"; echo "<td>".$row["ag"]."</td>"; echo "</tr>"; } echo "</table>"; ?> </body> </html>

    • ベストアンサー
    • PHP
  • Webプログラミングについて

    Webプログラミング初心者です. PHP 文字化けについて質問です データベースをつかった簡単なリンク(検索)を作ろうとおもったのですが, function cnv_sqlstr($string){ $det_enc=mb_detect_encoding($string,"SJIS,utf8,EUC-JP"); if($det_enc and $det_enc != ENCDB){ $string=mb_convert_encoding($string,ENCDB,$det_enc); } $string=addslashes($string); return $string; } function cnv_dispstr($string){ $det_enc=mb_detect_encoding($string,"SJIS,utf8,EUC-JP"); if($det_enc and $det_enc != ENCDISP){ return mb_convert_encoding($string,ENCDISP,$det_enc); } else { return $string; } } このような感じで文字の変換を行ったつもりなのですが,日本語の文字が化けてしまいます...>< ENCDB,ENCDISPは共に定数化してあり,utf8としてあります. データベースの方は(Xamppを使用)照合順序の部分はutf8_unicode_ciとなっています. どうして文字化けが直らないんでしょうか??教えて下さい><

    • ベストアンサー
    • PHP
  • php5,MySQL5で文字化けが起こる

    環境:php5,MySQL5,XP MySQL5は、インストール時にsjisを指定。 php.iniもmbstring.internal_encoding = SJIS ドスプロンプトでSelect文を発行すると漢字で表示されます。 $dbtype = "mysql"; $sv = "localhost"; $dbname = "*****"; $user = "root"; $pass = "*****"; // 文字コード $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; // データの文字コードを変換する関数 function cnv_enc($string, $to, $from) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, $from . ", " . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } // データベースに接続する $dsn = "$dbtype://$user:$pass@$sv/$dbname"; $conn = DB::connect($dsn); $sql = "SELECT * FROM A"; $res = $conn->query($sql); →この後、SQLの内容をIEで表示させると ”2 Web?? 002 ??????????????”の様に テーブルの中の漢字の部分だけが??????で表示されます。 ヒント、参考になるサイトなど、教えていただけると幸いです。

    • ベストアンサー
    • PHP
  • mb_detect_encoding

    mb_detect_encodingについてどなたかご教授ください。 PHPによるWebアプリケーションスーパーサンプル http://www.nishi2002.com/phpsample/​ にて勉強してるのですが、どうしてもわからない所がありまして 知恵を貸していただきたく投稿いたします。 本書の中で $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; // データの文字コードを変換する関数 function cnv_enc($string, $to, $from) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, $from . ", " . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } とユーザー定義関数を指定して // 取り出したデータを表示する echo "<select name=\"menu1\">"; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<option value=\"".$row["id"]."\">". cnv_enc($row["nam"], $enc_disp, $enc_db)."</option>"; このように使用しているのですが 定義する段階での $det_enc = mb_detect_encoding($string, $from . ", " . $to); この部分がわかりません。 この関数は文字エンコーディングを検出する関数であるというのはわかるんですが、(http://jp.php.net/manual/ja/function.mb-detect-encoding.php)参照 「$from」 のあとの 「.」 の意味などがどうしてもわかりません。 またなぜ引数が3つ指定されているのでしょうか? 調べてみたのですが解答にいきつかず、どなたかご教授お願いします!!!

    • ベストアンサー
    • PHP
  • 文字化けしないで表示する方法を教えてください

    MySQLのデータを読み出してドロップダウン・メニューを生成するだけのコードですが、文字コードがうまく変換されないので文字化けします。 具体的には、PHPサンプル集というデータがデータベースに入っていたとすると PHP????? と表示されます。 部分的に自分でコメントアウトして直そうとしています。 1 <html> 2 <head> 3 <title>選択リストをデータベースから生成する</title> 4 </head> 5 <body> 6 <?php 7 // 接続設定(サーバ/データベース/ユーザ/パスワード) 8 $sv = "localhost"; 9 $dbname = "testdb"; 10 $user = "root"; 11 //$pass = "********"; 12 $pass = ""; 13 14 // 文字コード 15 //$enc_disp = "EUC-JP"; 16 //$enc_db = "EUC-JP"; 17 $enc_disp = "UTF-8"; 18 $enc_db = "UTF-8"; 19 20 // データの文字コードを変換する関数 21 function cnv_enc($string, $to, $from) { 22 // 文字コードを変換する 23 $det_enc = mb_detect_encoding($string, $from . ", " . $to); 24 // if ($det_enc and $det_enc != $to) { 25 if ($det_enc != $to) { 26 return mb_convert_encoding($string, $to, $det_enc); 27 } 28 else { 29 return $string; 30 } 31 } 32 33 // データベースに接続する 34 $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); 35 mysql_select_db($dbname) or die("接続エラー"); 36 37 // データを取り出す 38 $sql = "SELECT id, nam FROM prod ORDER BY id"; 39 $res = mysql_query($sql, $conn) or die("データ抽出エラー"); 40 41 // 取り出したデータを表示する 42 echo "<select name=\"menu1\">"; 43 while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { 44 echo "<option value=\"".$row["id"]."\">". 45 // cnv_enc($row["nam"], $enc_disp, $enc_db)."</option>"; 46 cnv_enc($row["nam"], "UTF-8", "UTF-8")."</option>"; 47 } 48 echo "</select>"; 49 50 // 接続を解除する 51 mysql_close($conn); 52 53 ?> 54 </body> 55 </html> きっと、24行目のcnv_encのandは間違いですよね? コメントアウトして自分なりに直してみましたが、それでも結果は変わりません。 データベース自体には文字化けがないことは確認しました。MySQLAdminでも同様です。 select id, nam from prod order by id; +----+--------------------------------+ | id | nam | +----+--------------------------------+ | 1 | PHPサンプル集 | | 2 | PHPリファレンス | | 3 | PHPデータベース構築法 | | 4 | PHPの基礎がわかる本 | | 5 | PHP活用法 | +----+--------------------------------+ 5 rows in set (0.00 sec) character setはUTF-8です。 では、お願いします。

    • ベストアンサー
    • PHP
  • レンタルサーバーでphpmyadminの文字化け

    レンタルサーバーでMYSQLとPHPを使用したいのですが、PHPからINSERTした文字が、phpmyadminの画面だけで文字化けしてしまいます。 MySQLの文字コード設定は UTF-8 Unicode (utf8) で、照会順序も utf8_unicode_ci です。 INSERTする文字もINSERT直前に文字コードを変更し、確認したところutf8になっています。 コードは以下のとおり。 <?php $sql = mb_convert_encoding("$info","UTF-8"); $mojicode = mb_detect_encoding($info,mb_list_encodings()); print "$info の文字コードは $mojicode です。"; ?> PHPでMySQLからデータをSELECTで表示させた際は、文字化けせずに表示されます。 表示させるサイトの文字コードはutf-8です。 表示させる前に文字コードを変換させています。 スクリプトは以下のとおり。 <?php //文字コード $enc_disp = "utf-8"; $enc_db = "utf-8"; //データの文字コードを変換する関数 function cnv_enc($string, $to, $from) { //文字コードを変換する $det_enc = mb_detect_encoding($string, $from . "," . $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } //データベースに接続 $conn=mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die ("接続エラー"); //データを取り出す //取りだすレコードの開始位置 $st=0; //取りだす最大レコード数 $lim=5; $sql = "SELECT number,date,info FROM info ORDER BY date DESC LIMIT $st,$lim;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); //mysql_query()関数でデータを取り出すSQLを実行する //取り出したデータを表示する echo "<table border=\"0\" id=table>"; while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { echo"<tr>"; echo"<td colspan='2'>".' ・ '.$row["date"].' / '.cnv_enc($row["info"], $enc_disp, $enc_db)."</td>"; echo"</tr>"; } echo "</table>"; ?> なお、表示する際、文字コードを変更する前にデータの文字コードを調べたところ、ASCIIとなっていました。 phpmyadminに入った際にASCIIになったのでしょうか? 解決策がわからず困っています。 どなたか解決策を教えていただけないでしょうか。 よろしくおねがいします。

    • ベストアンサー
    • MySQL
  • SJISからUTFに変換してのDB登録がある文字だけうまくいかない。

    PHPとPostgresでデータベース構築中の初心者です。宜しく御願いします。 今現在なんとかSJIS(windows)からUTF(linux)へ文字コードを変換してDBへデータを入力できるようになり、テスト中なのですが、問題が発生しました。 データがある文字で終わる場合のみデータ追加ができない、という問題です。 今分かっているのは、「表」という文字です。 しかも、文字列の最後に来た場合のみエラー(SQLでINSERTできない)がでます。 例えば、「方針発表」と入力した場合、エラーですが、 「方針発表出席」と入力すればデータ追加可能です。 いろいろ調べている途中ですが原因、解決策ともにまだ不明です。 どなたか御教授願います。 ちなみに、文字コード変換は次の関数cnvで行っております。 function cnv($string, $enc){ $det_enc = mb_detect_encoding($string, "UTF8, SJIS"); if ($det_enc and $det_enc != $enc){ return mb_convert_encoding($string, $enc, $det_enc); }else{ return $string; }}

    • ベストアンサー
    • PHP
  • PHP・MySQLでデータベースを作成しています。

    PHP・MySQLでデータベースを作成しています。 Fatal error: Call to undefined function: mb_detect_encoding() in c:\xxxxxx\xxxxxx\xxxxxx\index.php on line 20 というエラーが出てきてデータベースの情報が反映されません。 恐らく文字コード変換の関数が間違っているのだと思いますが function cnv_enc($string, $to, $from) { // 文字コードを変換する $det_enc = mb_detect_encoding($string, $from, $to); if ($det_enc and $det_enc != $to) { return mb_convert_encoding($string, $to, $det_enc); } else { return $string; } } どこが間違っているのかが何度試しても分かりません。 ちなみのline 20の部分は、ちょうど下記になります。 $det_enc = mb_detect_encoding($string, $from, $to); PHP・MySQLともにほぼ初心者に近い状態なので 本読みながら作成しています。よろしくお願いします。

    • 締切済み
    • PHP
  • データベースの文字が???で表示される

    PHPによるwebアプリケーションスーパーサンプルという参考書のプログラム(p552)でどうしても実行できないものがあります。 やりたいことはMySQLに接続してデータを表示させるというものです。数字であるIDと年齢は表示されるのですが、文字である名前と出身地のところが「???」で表記されてしまいます。 何度も参考書のソースプログラムを見直したのですがどこが違うのか分かりません。以下は原因がありそうなコードの抜粋です。(抜粋なのでエラーと関係なさそうなコードは途中でも省略しています。) よろしくお願いします。 idはID、namは名前、preは出身地、agは年齢です。 //文字コード $enc_disp = "EUC-JP"; $enc_db = "EUC-JP"; //データの文字コードを変換する function cnv_enc($string, $to, $from){ //文字コードを変換する $det_enc=mb_detect_encoding($string, $from.",". $to); if($det_enc and $det_enc != $to){ return mb_convert_encoding($string, $to, $det_enc); } else{ return $string; } } //データを取り出す $sql="SELECT id,nam,pre,ag FROM table1 ORDER BY id"; $res=mysql_query($sql,$conn) or die("データ抽出エラー"); //取り出したデータを表示する echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>名前</td>"; echo "<td>出身</td>"; echo "<td>年齢</td>"; echo "</tr>"; while($row=mysql_fetch_array($res,MYSQL_ASSOC)){ echo "<tr>"; echo "<td>".$row["id"]."</td>"; echo "<td>".cnv_enc($row["nam"], $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc($row["pre"], $enc_disp, $enc_db)."</td>"; echo "<td>".$row["ag"]."</td>"; echo "</tr>"; } echo "</table>";

    • ベストアンサー
    • PHP

専門家に質問してみよう