mb_detect_encodingについての質問

このQ&Aのポイント
  • mb_detect_encoding関数は、文字エンコーディングを検出する関数です。
  • 引数$fromは、検出する文字エンコーディングの候補となる文字エンコーディングを指定します。
  • 引数$toは、変換先の文字エンコーディングを指定します。
回答を見る
  • ベストアンサー

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
  • 回答数3
  • ありがとう数1

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

  • ベストアンサー
  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.3

PHPの変数名に $from." は使用できないの(. と " は使用不可)で $from." = "EUC-JP"; とはできません。また " . $to も変数名でない(変数名は $ から始める)ので " . $to = "UTF-8"; とはできません。 変数 $from および $to がそれぞれ1つの文字列と考えて下さい。ですので先ほど回答したように $from = "EUC-JP"; // 文字列を$fromに代入 $to = "UTF-8"; // 文字列を$toに代入 とすると、 $from . "," . $to は "EUC-JP" . "," . "UTF-8" となり、全てが結合されて "EUC-JP,UTF-8" という新たな文字列が作られています。 文字列の結合は例えば、 $sample = "hehehe" . "foo" . "hogehoge"; と記述すれば、これは $sample = "hehehefoohogehoge"; と同じ結果になります。 今回の $from . "," . $to というのは、上記の例の最初の文字列("hehehe")と最後の文字列("hogehoge")が変数になっているととらえて下さい。 文字列結合はよく使用しますので、しっかりマスターしましょう!

osaka58
質問者

お礼

めちゃめちゃよくわかりました!!!! ありがとうございます!! これで一歩前に進むことが出来ました!! また何かありましたらよろしくお願いします^^

その他の回答 (2)

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.2

先ほどのアドバイスの補足説明です。 $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; } の箇所ですが、mb_detect_encoding()関数で検出された文字コードが $to と違っていれば文字コードを変換して、$to と同じであれば何も変換しないという処理です。

osaka58
質問者

補足

補足までありがとうござます!! この「"」の位置がわからないのですが $from." にEUC-JPを代入すると EUC-JP" となり " . $toにUTF-8を代入すると "UTF-8 となり $det_enc = mb_detect_encoding($string, EUC-JP","UTF-8); となってしまうと考えてしまうのですが補足していただいてもよろしいでしょうか!? よろしくお願いします!!!

  • x_jouet_x
  • ベストアンサー率68% (162/236)
回答No.1

「.」は文字列結合の演算子です。 $from = "EUC-JP"; $to = "UTF-8"; だったと仮定すると $det_enc = mb_detect_encoding($string, $from . ", " . $to); の箇所を変数を使用せずに記述すると $det_enc = mb_detect_encoding($string, "EUC-JP,UTF-8"); となります。

osaka58
質問者

補足

早速の回答ありがとうざいます!! この「"」の位置がわからないのですが $from." にEUC-JPを代入すると EUC-JP" となり " . $toにUTF-8を代入すると "UTF-8 となり $det_enc = mb_detect_encoding($string, EUC-JP","UTF-8); となってしまうと考えてしまうのですが補足していただいてもよろしいでしょうか!? よろしくお願いします!!!

関連するQ&A

  • 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
  • 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
  • 文字化け

    文字コードを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
  • 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
  • データベースの文字が???で表示される

    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
  • 文字化けしないで表示する方法を教えてください

    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
  • SQL文で「あ」などの2バイトの文字を条件に入れるとエラーになる。

    PHPとPostgreSQLでファイルを作成しました。 (2)、(3)の場合だと問題なく動作しますが、 (1)の場合だと動作しません。 「あ」が2バイトなのが原因かとおもうのですが、 よくわかりません。他に原因あるのでしょうか。 ********************************************** 環境 PHP5 Apache2.2 PostgreSQL8.24 ********************************************* <?php // 接続設定(サーバ/データベース/ユーザ/パスワード) $sv = "localhost"; $dbname = "test"; $user = "user"; $pass = "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; } } // データベースに接続する $conn = pg_connect("host=$sv dbname=$dbname user=$user password=$pass") or die("接続エラー"); (1)$sql = "select * from test WHERE name LIKE N'あ%'"; (2)$sql = "select * from test WHERE tel LIKE N'090%'"; (3)$sql = "select * from test WHERE no LIKE N'a%'"; ?> ********************************************* nameには、名前の文字列(いとう、さとう)が、 telには、電話番号(090…、03…)が、 noには、アルファベット一文字(a、b)が 入力されています。 *********************************************

  • 文字化けについて

    お世話になります 携帯サイトの文字化けに困っています。 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
  • 携帯の文字化け

    パソコンで入力したお知らせをパソコンと携帯で確認できるようにしたものを、サーバーを移管したところ、携帯で見る方だけ文字化けをおこすようになりました。 <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

専門家に質問してみよう