文字化けで困っています。view.phpはShift_JISで記述しました。


WindowsXP
Apache 2.0.55
PHP 5.1.1 Shift_JIS
MYSQL 5.0.16 UTF-8
PHPMYADMIN 2.6.4-pl4

PHP.iniの主要な設定

extension=php_mbstring.dll
extension=php_mysql.dll
default_charset = IShift_JISI
mbstring.internal_encoding = UTF-8
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none;

PHPMYADMINを使用してデータを入れました。PHPMYADMINではデータ内容は全て文字化けせずに正常に表示されます。

自分でデータ内容を表示するPHPを書き(view.php)、データベース内容を表示さすと日本語部分が??????????で全て表示されます。変な文字になることもなく、半角英数以外は「?」になります。

ここで色々やりとりして解決に導いてほしいです。

知っている方よろしくお願いします。上記の設定にはこだわっていません。

また、最終的にはLINUXで運用ですので、助言もお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/30 23:03:15
  • 終了:--

回答(5件)

id:jouno No.1

jouno回答回数280ベストアンサー獲得回数02005/11/30 23:17:32

ポイント50pt

mysqlのデフォルト文字コードがutf-8になっているということですが、phpmyadminで入力した文字列の実際の文字コードはなんになっているのでしょうか。phpmyadminの文字コードがutf-8ならば、utf-8になっているのかもしれません。phpmyadminをブラウザで見たときの文字コードはなんになっているでしょうか。


また、mb_convert_encodingを使用した上で文字化けしているのでしょうか。使用しないで文字化けしているのであれば、単純に文字コードを変換するか、スクリプトのほうをutf-8にあわせるかすれば解決する可能性があります。ともかく、問題の文字列の実際のエンコーディングを知る必要があります。


mb_detect_encoding()で検証してみてはいかがでしょうか。

id:haring

ご回答ありがとうございます。

phpmyadminはutf-8となっていました。

phpmyadminのトップページには下記のようになっていました。

Language Japanese(ja-utf-8)

MySQLの文字セット UTF-8 Unicode(utf8)

MySQL 接続照会順序 utf_general_ci

mb_convert_encodingというのは使っているのか、分かりません。何処を見れば分かりますでしょうか?

宜しくお願いします。

2005/11/30 23:34:33
id:jouno No.2

jouno回答回数280ベストアンサー獲得回数02005/11/30 23:50:37

ポイント50pt

mb_convert_encoding()は関数なので普通にソースを文字列を検索すれば使っていれば発見できます。


で、$strがmysqlから取り出した文字列だとします。


echo mb_detect_encoding($str,”auto”);


でutf-8になるかどうか確認してください。

その場合、データベースの中には、utf-8の形式で文字列が入っているわけです。ですから、そのまま表示すると、sjisのhtmlにutf-8の文字列が混在する結果となり、文字化けします。


したがって、その文字列を表示する部分以前のところに、


/* 内部文字エンコーディングからSJISに変換 */

$str = mb_convert_encoding($str, ”SJIS”);


の一行を入れてみてください。

id:haring

ありがとうございます。

本を見ながらやっているもので、下記のような状態です。なんとなく書き方は分かるのですが、もう少し詳しくお願い致します。

mysql_select_db($database_cannBlog, $cannBlog);

$query_rsBlog = ”SELECT * FROM blog_data ORDER BY updtime DESC”;

$rsBlog = mysql_query($query_rsBlog, $cannBlog) or die(mysql_error());

$row_rsBlog = mysql_fetch_assoc($rsBlog);

$totalRows_rsBlog = mysql_num_rows($rsBlog);

?>

<html>

<head>

<title>無題ドキュメント</title>

</head>

<body>


</body>

</html>

mysql_free_result($rsBlog);

?>

2005/12/01 00:04:37
id:kai10 No.3

kai10回答回数115ベストアンサー獲得回数32005/12/01 00:40:06

ポイント20pt

http://allabout.co.jp/career/database/closeup/CU20050321A/index....

phpiniの文字コードの設定 - [データベース]All About

php.iniで、

 output_buffering = On

 output_handler = mb_output_handler

となっているか確認してください。この設定がないと、確か文字コードの変換を(自動で)行ってくれなかったと思います。

それと、設定の確認は phpinfo() で行うといいです。phpMyAdmin からだと、「PHP情報」です。

id:haring

kai10さんご回答ありがとうございます。

output_buffering が1

output_handler がno valueとなっておりました。

output_handler = mb_output_handlerにしてみましたが、駄目でした。

2005/12/01 01:51:15
id:FTTH No.4

FTTH回答回数22ベストアンサー獲得回数12005/12/01 01:54:53

ポイント20pt

横レスから

------------------------------------

>output_handler がno valueとなっておりました

>no valueのところが問題でしょうか?

多分問題でしょう。

output_handler = mb_output_handler

とすべき。

------------------------------------


mbstring.internal_encoding = UTF-8

なので、スクリプトをUTF-8で保存して試せば巧くいくような気もします。

一度試してみては。

(単純にecho ”あいうえお”;で文字化けしませんか?)


あと、

>最終的にはLINUXで運用ですので、助言もお願いします。

であれば最初からLINUXで環境設定をしたほうがいいと思います。

WINDOWSで文字コードを合わせるためにやったことを、LINUXでもう一度やることになりかねませんよ。

(勿論十分な知識があれば問題にはならないのですが……)

id:haring

スクリプトをUTF-8で保存してみましたがダメでした。

もう少し色々と設定を見直してみます。

2005/12/01 02:39:25
id:roiko No.5

roiko回答回数67ベストアンサー獲得回数02005/12/01 02:31:28

ポイント10pt

もしかして、Apacheの設定が原因ということはありませんか? 自分はそれではまったことがあるので。


httpd.confの中に「AddDefaultCharset」という項目があるので、それを「AddDefaultCharset off」として有効にする。


かつ「Default charset to iso-8859-1」が有効になっていたら、頭に「#」を付けて無効にする。


という対応ではいかがでしょうか? PHP側に問題がなければ、この原因も考えられます。

id:haring

そのあたりも含めて設定を見直したいと思います。

質問は一度終了して、色々やってみてから再度質問したいと思います。

2005/12/01 02:41:57

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません