日本語の文字化け?について - PHPプロ!Q&A掲示板

2530

  • 0P

日本語の文字化け?について

質問日時 / 2010年2月16日 11:39    回答数 / 6件

Questioner:  sag0308  このエントリーをはてなブックマークに追加 

キーワード / mysql    header関数    日本語   

初めて質問させて頂きます。

最近PHPを独学で何とか始めたのですが、MYSQLのテーブルに対しSELECT文を発行し、取得したデータをHeader関数で、CSVファイルに出力たところ日本語部分が?で出力されてしまうという現象で困っております。

色々と調べて試してみたのですが、調べ方が悪いのか原因がわかりません。

環境はレンタルサーバー、PHP5で、MYSQLの文字セットはUTF-8を指定しています。

お手数をお掛けして申し訳ないのですが、宜しくお願い致します。


以下がCSV出力を行っているソースになります。

  1. function crtCSV()
  2.   {
  3.   header("Content-Disposition: attachment; charset=UTF-8; filename=backup".date(ymd).".csv");
  4.   $dbHandle = mysql_connect("localhost","aaaaa","bbbbb");
  5.   if ($dbHandle == False)
  6.      {
  7.       print ("can not connect db\n");
  8.       exit;
  9.      }
  10.   $db = "aaaaa";
  11.   $sql = "select * from table order by t1";
  12.   $rs = mysql_db_query($db,$sql);
  13.   $fields = mysql_num_fields($rs);
  14.   $rows = mysql_num_rows($rs);
  15.   for($i=0;$i<$rows;$i++)
  16.      {
  17.       for($j=0;$j < $fields;$j++)
  18.          {
  19.           $wk = mysql_result($rs,$i,$j);
  20.           $wk = mb_convert_encoding($wkdata, "UTF-8", "AUTO");
  21.           print($wk);
  22.           if ($j < $fields - 1)
  23.               print(",");
  24.          }
  25.       print("\n");
  26.       }
  27.   }

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01moetensag0308さんこんにちは。 気になる点がいくつかあ
┃┗A01-1sag0308ありがとうございます。 MYSQLのバージョンは4.1.2
┗A02shimix>MYSQLの文字セットはUTF-8を指定しています。 php
 ┗A02-1sag0308ありがとうございます。 出力されたCSVをエディタ
  ┗A02-1-1shimix最低限、下記の指定はやっていないとマズイです。
   ┗A02-1-1-1sag0308ありがとうございました。 mb_internal_encodingと

回答一覧

並び替え:

A01 満足
answerermoeten [2月16日 11:49]

sag0308さんこんにちは。

気になる点がいくつかありまして、

使用しているMySQLのバージョンはいくつか(おそらく5以降だと思います)
echo mb_detect_encoding( $wkdata );でどのようなエンコードが返されるのか
PHPソースの文字コードは何で書かれているのか

です。

また、
mysqlの情報取得の際に文字コードを指定することができたかと思います。

set name sjis など

ただし、こちらはセキュリティ的によろしくないので、php側で用意されたmysqlの関数を使用するとよかったと思います。
この辺はちょっと検索してほしいです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyersag0308 [2月16日 13:17]

ありがとうございます。

MYSQLのバージョンは4.1.22でした。

さらに、PHPのソースをUTF-8にしていたつもりが何故か、SJISで記述していました(恥

mb_detect_encodingで文字コードを調べたところ、ASCIIになっていました。

もう少し頑張ってみます。

この意見に回答する

ツリーへ TOPへ

A02 満足
answerershimix [2月16日 11:52]

>MYSQLの文字セットはUTF-8を指定しています。

phpスクリプトもUTF-8ですよね。もしそうでなければmysql_set_charsetを書いて、いったんスクリプトの文字コードに合わせてください。

また、csv出力はutf-8のようですが、csvファイルをエディタで(utf-8で)開いて確認されているということでいいんですよね?

この意見に回答する

ツリーへ TOPへ

A02-1
replyersag0308 [2月16日 13:14]

ありがとうございます。

出力されたCSVをエディタで見たり、BinaryEditorで変換してコードで見たりしています。

PHPのソースはUTF-8で書いていると思い込んでいたのですが、なぜかSJISで記述していました(恥ずかしい限りです)

もう少し頑張ってみます。

この意見に回答する

ツリーへ TOPへ

A02-1-1 満足
replyershimix [2月16日 13:44]

最低限、下記の指定はやっていないとマズイです。

・スクリプトの先頭でmb_internal_encoding
・mysqlに接続したらmysql_set_charset

それ以外にも使う関数によってによって必須の指定があります(mb_send_mailならmb_languagemb_ereg系の関数ならmb_regex_encoding)。

この意見に回答する

ツリーへ TOPへ

A02-1-1-1
replyersag0308 [2月16日 14:13]

ありがとうございました。

mb_internal_encodingとmysql_set_charsetをソースに記述したところ、ちゃんと日本語出力されるようになりました。

感謝感激ですm(_ _)m

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
動的なURLを静的に見せる方法
 このエントリーをはてなブックマークに追加 
A
普通に考えて、mod_rewrite でしょうね。 http://www.nishishi.com/blog/2006/01/mod_rewrite_url.html...

>>続きを読む

GETのままでは検索エンジンのロボットが拾ってくれなかったためにSEO対策として有効だと言われていますね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)