• ベストアンサー

日本語のデータが文字化けをしてしまいます。

PHP初心者です。 レンタルサーバでdatファイルに書き込んでる情報をPHPファイルで出力すると、日本語の部分が文字化けしてしまいます。 datファイルから読み込んでいない日本語の部分はちゃんと表示されています。 また、datファイルにはちゃんと日本語のデータになっています。 文字コードはEUC、 PHPの出力はSJIS。 これはどういうことでしょうか? どなたか教えて下さい。 ソースは以下3ファイル構成↓ <入力するデータを集めるファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(書き込み)</h1> <form method="POST" action="guest_write.php"> お名前: <input type="text" name="name" size="20" maxlength="30" /><br /> メッセージ: <input type="text" name="message" size="70" maxlength="255" /><br /> <input type="submit" value="送信" /> </form> </body> </html> <入力したデータをdatに書き込むファイル> <?php $file=fopen("guest.dat","a"); flock($file,LOCK_EX); $line =date("Y年 m月d日 H:i:s")."\t"; $line.=$_POST['name']."\t"; $line.=$_POST['message']."\t"; fputs($file,$line."\n"); flock($file,LOCK_UN); fclose($file); header("Location: guest_input.php"); ?> <datファイルから読み込んで出力するファイル> <html> <body> <h1 style="background:#cccccc">ゲストブック(閲覧)</h1> <?php $file=fopen("guest.dat","r"); while($row=fgetcsv($file,1024,"\t")){ ?> <ol> <li>お名前:<?php print($row[1]); ?></li> <li>メッセージ:<?php print($row[2]); ?></li> <li>書き込み日時:<?php print($row[0]); ?></li> </ol> <hr /> <?php } fclose($file); ?> </body> </html> 以上ですが、宜しくお願い致します。

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

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

試しに、 <li>お名前:<?php print(mb_convert_encoding($datum[1],"SJIS","EUC-JP")); ?></li> とかしてみたら

rad6
質問者

お礼

出来ませんでした。 windowsにアパッチとPHP5を入れて実行すると、ちゃんと見れるんですがね… 何でか全然わかりません。。 誰か助けてください~(>o<")

その他の回答 (2)

回答No.3

どのように出力されるはずが、どのように出力されているんでしょう? 文字コードによる文字化けなら何がどのように化けているのか、その文字をみれば大体分かると思います。 勘ですと fgets($file,1024)) ここを fgets($file,4096)) にすると直ったり。

rad6
質問者

お礼

お名前:**** メッセージ:宜しくね 書き込み日時:2005年 12月04日 13:04:40 と表示されるところが、 お名前:?g????/li> メッセージ:?X????/li> 書き込み日時:2005年 12月04日 13:04:40 と表示されてしまいます。 fgets($file,4096))にしたけど、ダメでした。 どうすれば良いでしょうか?

rad6
質問者

補足

DATファイルの中身は 『2005ヌッ 12キ・4ニ・ 13:04:40 **** 宜しくね』 になっています。 datファイルをsjisで保存すると、 『**** 宜しくね』がちゃんと表示され、 2005年 12月 4日がちゃんと表示出来なくなりました。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.1

そういう処理をする場合は EUCかSJISか、文字コードを統一させる事が大前提ですよ もしくは、どうしてもDATファイルをEUC、ソースをSJISと使い分けたいのであれば、文字コードを変換して読み書きしなければなりません

rad6
質問者

お礼

fgetcsv関数はLINUX環境だと文字化けを起こすと調べた上分かりましたので、fgets関数を使い、以下のように修正しましたが、まだ文字化けを起こしています。 <html> <body> <?php $file=fopen("guest.dat","r"); while($row=fgets($file,1024)){ $datum=explode("\t",$row); ?> <ol> <li>お名前:<?php print($datum[1]); ?></li> <li>メッセージ:<?php print($datum[2]); ?></li> <li>書き込み日時:<?php print($datum[0]); ?></li> </ol> <hr /> <?php } fclose($file); ?> </body> </html> レンタルサーバのバージョンはPHP4.3.10です。 どうすれば直りますでしょうか? 本当に困ってます。 どうか宜しくお願い致します。

rad6
質問者

補足

すみません。一部説明不足でした。 『文字コードはEUC、PHPの出力はSJIS。』 とは、PHPファイルをEUCで保存し、出力をphp_value mbstring.http_output SJISで設定しているという意味です。

関連するQ&A