ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

初心者PHP講座コミュの【質問】MySQLのデータベース上の日本語がPHPでWEB上に表示させると「?」マークで文字化けする

  • mixiチェック
  • このエントリーをはてなブックマークに追加
はじめまして、こんにちわ。
PHP初心者ですが質問させて下さい!

MySQLで作ったデータベースをPHPで操作して、
WEBブラウザで表示させたのですが、
コマンドプロンプト上で日本語で表示されている箇所のみ、
「?(半角)」マークで表示されてしまいます。

文字コード周りの問題とは思うのですが、正直、見当がつかない状態で…。
現在、文字コード周りの設定は、以下のとおりです。

<php.ini>
default_charset = "Shift_JIS"
mbstring.internal_encoding = EUC-JP
mbstring.http_output = sjis

<my.ini>
[client]
default-character-set=sjis

[mysql]
default-character-set=sjis

[mysqld]
default-character-set=sjis
old-passwords

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=sjis

動作環境
OS/Windows
Apache2.0.54
PHP5.0.4
MySQL4.1.14

みなさん、お忙しいとは思うのですが、返答など下さったら大変助かります。
どうぞよろしくお願い致します。

コメント(5)

win版のphpとmysqlは 使ったこと無いんですが・・・
さらに、インストールも過去数回なんであまり覚えてないのですが(笑
ブラウザでは 表示されたんですか?
文字化けしてもエンコード変更したら表示したんでしょうか?

コマンドプロンプトはwin付属の・・あれですか?
あれって EUCとか表示できないのでは?
フリーのテラタームなどはいかがですか?

winのプロンプトで日本語表示させるなら、文字コードを
sjisアタリで統一しないとダメなのではないのかな〜と
思いました・・・

linuxサーバがECUなので、プロンプトで接続してselect掛けて見ましたが・・・文字化けしました
internal_encodingが内部文字コードだからココがEUCだと
コマンドプロンプトじゃダメなのかな?
と・・思いました・・・

ここ1000人居るんだし、だれか〜「ズバリこれでしょう!」ってやつ
かましてくださ〜い(笑
文字コード周りはそれでオッケーです。
問題は、MySQL のバージョンですかね。
MySQL4.1 では日本語を使用するときには、はじめに

set names sjis

というクエリを通さないといけません。
php で mysql_connect した後、mysql_select_db をすると思いますが、
その後、mysql_query( "set names sjis" ) と通してください。
これでいけるはずです。
お二人とも、返答ありがとうございました。

T_Tsanさんの仰る方法で試してみたのですが、
ブラウザ上に限り、やはり日本語が上手く表示されません。
(プロンプト上では表示されます)

今度は、「?(半角)」ではなくなりました。
(例えば「エステ」という文字列は「GXe」
 「ルクセンブルグ」は「NZuO」と表示されます)

また、ブラウザのエンコードも変更しましたが、
文字化けは直りませんでした。
コマンドプロンプトは、win付属のものです。
テラタームというのは、ちょっと知識不足でよく分からないのですが…。

---------------------------------------------
ちなみに、以下のようなコードです。

<?

if($mysql = mysql_connect('localhost','user','password'))
{
   echo 'MySQLに接続しました'.PHP_EOL;
}

mysql_select_db('phptest',$mysql);
mysql_query("set names sjis");
$query = 'select * from basic order by id';
$result = mysql_query($query,$mysql);
$num = mysql_num_fields($result);
print("<table border = 1>");
for ($i=0;$i<$num;$i++)
{
 print("<td>".mysql_field_name($result,$i)."</td>");
}
while($row=mysql_fetch_array($result))
{
 print("<tr>");
 for($j=0;$j<$num;$j++)
 {
  print("<td>".$row[$j]."</td>");
 }
 print("</tr>");
}
print("</table>");
mysql_close($mysql);

?>

何がいけないのか、さっぱりです。
何度も申し訳ないですが、お気づきの点あればお願いします…。
お騒がせしました、解決いたしました。

mysql_query("set names sjis")を通した上で、
php.iniファイルの文字コード周りを以下のように設定したら、
日本語が正常に表示されるようになりました。

default_charset = Shift_JIS
mbstring.internal_encoding = Shift_JIS
mbstring.http_output = sjis

これで、日本語が正常に表記されました。


ただ、希望としては、
PHPの内部エンコーディングはEUC-JPにしたかったので、
mbstring.internal_encoding = EUC-JP
SQL文をmysql_query("set names ujis")
にしてみたところ、正常に表示されました。


初心者のぶしつけな質問にお答えいただき、
まことにありがとうございました。

今後も質問させて頂くことがあるかもしれませんが、
どうぞよろしくお願い致します。
ちょっと探してみましたら
4.1.xで、変わったようですね

http://blog.cles.jp/i/item/406/catid/28
と
http://www.mysql.gr.jp/mysqlml/mysql/msg/12168
と
http://www.wikiroom.com/asakura/?MySQL%2FUTF8
と起動オプションとかもあるようですね
あと、T_Tsanさんのset names sjis もかかれてますね
テラタームはフリーで使える telnetのソフトです
サーバに接続に便利なので使う物ですが、プロンプトでは
文字化けして無いようなのでいらないかな と思います。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

初心者PHP講座 更新情報

初心者PHP講座のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。