• ベストアンサー

文字化け

文字コードを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
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
noname#14871
noname#14871
回答No.4

// 表示文字コード $disp_enc = "EUC-JP"; とありますが、以後、$encの定義が見当たりませんが、 // データの文字コードを変換する関数 function cnv_dbstring($string, $enc) { で、$enc は $disp_enc の誤記ではありませんか?

その他の回答 (3)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.3

>決め打ちとは具体的にはどのようにして、実施するのですか? $det_enc = mb_detect_encoding($string); を $det_enc = "EUC-JP"; のようにすることです。 mysqlで設定されている文字コードが決まっているはずなので、それを設定します

noname#14871
noname#14871
回答No.2

WEBサーバはapache2でしょうか? apapche2の場合、httpd.confの AddDefaultCharset ISO-8859-1 の部分をコメント化しないと文字化けすると聞いてます。 #AddDefaultCharset ISO-8859-1

参考URL:
http://www.stackasterisk.jp/tech/systemConstruction/apache03_01.jsp
rapid6
質問者

お礼

はい。apache2です。 ご指摘の点を直したところ、 一部文字化けは解消されました。 残りは自力で解決したいと思います。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

mb_detect_encoding は、使用されている文字コードを勘違いする場合があります。 文字コードがあらかじめわかっているとして、決め打ちでやってみて化けるかどうかを調べてみてはどうでしょうか

rapid6
質問者

補足

ご回答ありがとうございます。 決め打ちとは具体的にはどのようにして、 実施するのですか? よろしくお願いします。

関連するQ&A

  • データベースの文字が???で表示される

    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
  • レンタルサーバーで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
  • PHPでのMYSQL操作について教えてください。

    MYSQLの中のデータをPHPで一覧にして表示し、フォームの内容を変更してから変更ボタンを押すと変更を反映した内容が一覧になって表示されるようにしたいのですが、うまくいきません。 コードは以下のとおりです。 <?php //接続設定 $sv="localhost"; $dbname="****"; $user="****"; $pass="****"; //文字コード $enc_disp="shift-jis"; $enc_db="shift-jis"; //データの文字コードを変更する 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用に変換 function cnv_sqlstr($string) { if (get_magic_quotes_gpc()) { $string = stripslashes($string); } $string = htmlspecialchars($string); $string = mysql_real_escape_string($string); return $string; } //データベース接続 $conn=mysql_connect($sv,$user,$pass) or die("接続エラー"); mysql_select_db($dbname) or die ("接続エラー"); //編集するデータを取得する if (count($_POST) >0) { $number=$_POST["number"]; $name=$_POST["name"]; //データが送信された時にはデータを変更する if (strlen($number) and strlen($name)) { //データを変更する $sql = "UPDATE customer SET number = ".cnv_sqlstr($number).", name = '".cnv_sqlstr(cnv_enc($name, $enc_db, $enc_disp))."', WHERE (number = ".cnv_sqlstr($number).");"; mysql_query($sql, $conn) or die("データ変更エラー"); } } //データを取り出す $sql = "SELECT number,name FROM テーブル名 ORDER BY number ;"; $res = mysql_query($sql, $conn) or die ("データ抽出エラー"); //取りだしたデータを表示する echo "<table border =\"1\">"; echo "<tr>"; echo "<td> </td>"; echo "<td>名前</td>"; echo "</tr>"; while ($row =mysql_fetch_array($res, MYSQL_ASSOC)) { echo "<form method=\"POST\" action=\"".$SERVER["PHP_SELF"]."\">"; echo "<tr>"; echo "<td><input type=\"submit\" value=\"変更\"></td>"; echo "<input type=\"hidden\" value=\"".$row["number"]."\" name=\"number\">"; echo "<td><input type=\"text\" name=\"name\" value=\"".cnv_enc($row["name"], $enc_disp, $enc_db) . "\"></td>"; echo"</tr>"; echo"</form>"; } echo"</table>"; //接続を解除する mysql_close($conn); ?> 現在は内容を変更して変更ボタンを押すと、「変更エラー」が表示される状態です。 何が原因かわからず行き詰っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 文字化けについて

    お世話になります 携帯サイトの文字化けに困っています。 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
  • ODBCでデータ抽出エラー

    下記プログラムを実行すると、データ抽出エラーとなってしまいます。 <?php $dsn = "database_4"; $user = ""; $pass = ""; $enc_disp = "EUC-JP"; $enc_db = "SJIS"; 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 = odbc_connect($dsn, $user, $pass) or die("接続エラー"); $sql = "SELECT music_0_ID,大分類,日本語作曲家名,日本語曲名 FROM music ORDER BY music_0_ID"; $res = odbc_exec($conn, $sql) 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 = odbc_fetch_row($res)) { echo "<tr>"; echo "<td>".odbc_result($res, "music_0_ID")."</td>"; echo "<td>".cnv_enc(odbc_result($res, "大分類"), $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc(odbc_result($res, "日本語作曲家名"), $enc_disp, $enc_db)."</td>"; echo "<td>".odbc_result($res, "日本語曲名")."</td>"; echo "</tr>"; } echo "</table>"; odbc_close($conn); ?> デバッグすると、解決できるでしょうか?PHP5.3.6.0を使用しているため、Zend Debuggerをインストールすべきか迷っています。また、Apacheでなく、IIS7.0を使用しています。アンインストールして、XAMPPを使用すべきでしょうか?また、リモートデバッグをする場合、PCが2台(サーバとクライアント)必要になるのでしょうか?

    • ベストアンサー
    • 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
  • 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
  • 携帯の文字化け

    パソコンで入力したお知らせをパソコンと携帯で確認できるようにしたものを、サーバーを移管したところ、携帯で見る方だけ文字化けをおこすようになりました。 <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
  • Shift-JISの半角英字が正しく表示されない

    【Eclipse PDTのバージョン】HELIOS 1.3.0 【XAMPPのバージョン】1.7.4 【OSの種類とバージョン】Windows Vista Business 32bit(x86)版 【ブラウザの種類とバージョン】IE8 【その他環境情報】Apache2.2.17 PHP5.3.5.0 Subversion 1.6.15 WinCacheGrind1.0.0.14 下記プログラムを実行(ExcelデータにODBC接続して抽出)し、ブラウザで表示(UTF-8)させると、一部の半角英字が正しく表示されません。例えば、「Händel」→「Handel」、「Chopin, Frédéric François」→「Chopin, Frederic Francois」、…。OSをLinuxにして、データベースを使用(すべてUTF-8)すると、解決するでしょうか? <?php $dsn = "database_4"; $user = ""; $pass = ""; $enc_disp = "UTF-8"; $enc_db = "SJIS"; 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 = odbc_connect($dsn, $user, $pass) or die("接続エラー"); $sql = "SELECT * FROM [music$]"; $res = odbc_exec($conn, $sql) or die("データ抽出エラー"); echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>大分類</td>"; echo "<td>日本語作曲家名</td>"; echo "<td>英語作曲家名</td>"; echo "</tr>"; $music_1_ID = @$_POST['music_1']; $i=0; while ($row = odbc_fetch_row($res)) { if ((int)odbc_result($res, "music_1_ID")==$music_1_ID) { $composer_ID = (int)odbc_result($res, "composer_ID"); if ($i!=$composer_ID) { echo "<tr>"; echo "<td>".(int)odbc_result($res, "composer_ID")."</td>"; echo "<td>".cnv_enc(odbc_result($res, "class_1"), $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc(odbc_result($res, "composer"), $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc(odbc_result($res, "composer_english"), $enc_disp, $enc_db)."</td>"; echo "<td><a href="."music_11.php?No=$composer_ID".">"."作品"."</a></td>"; echo "</tr>"; } $i=$composer_ID; } } echo "</table>"; odbc_close($conn); ?>

    • 締切済み
    • PHP
  • syntax error

    下記プログラムで2箇所syntax errorが出て、それぞれunexpected $conn、unexpected $rsが出ます。記法が誤っていますでしょうか? <?php $sv = "localhost"; $dsn = "database_4"; $user = ""; $pass = ""; $enc_disp = "EUC-JP"; $enc_db = "SJIS"; 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 = new COM("ADODB.Connection") $conn->open("Provider=SQLOLEDB;Data Source=$sv;Initial Catalog=$dsn;User ID=$user;Password=$pass;"); $rs = new COM("ADODB.Recordset") $sql = "SELECT * FROM music WHERE music_0_ID=1"; $rs->open($sql, $conn); echo "<table border=\"1\">"; echo "<tr>"; echo "<td>ID</td>"; echo "<td>大分類</td>"; echo "<td>日本語作曲家名</td>"; echo "<td>日本語曲名</td>"; echo "</tr>"; while (!$rs->eof) { echo "<tr>"; echo "<td>".$rs->fields["music_0_ID"]->value."</td>"; echo "<td>".cnv_enc($rs->fields["大分類"]->value, $enc_disp, $enc_db)."</td>"; echo "<td>".cnv_enc($rs->fields["日本語作曲家名"]->value, $enc_disp, $enc_db)."</td>"; echo "<td>".$rs->fields["日本語曲名"]->value."</td>"; echo "</tr>"; $rs->movenext(); } echo "</table>"; $rs->Close(); $conn->Close(); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう