こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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>

以上ですが、宜しくお願い致します。

投稿日時 - 2005-12-04 05:08:53

QNo.1818274

暇なときに回答ください

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

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

投稿日時 - 2005-12-04 11:33:02

お礼

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

投稿日時 - 2005-12-04 13:10:28

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

どのように出力されるはずが、どのように出力されているんでしょう?
文字コードによる文字化けなら何がどのように化けているのか、その文字をみれば大体分かると思います。

勘ですと

fgets($file,1024))

ここを

fgets($file,4096))

にすると直ったり。

投稿日時 - 2005-12-04 23:59:02

補足

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

投稿日時 - 2005-12-05 01:22:31

お礼

お名前:****
メッセージ:宜しくね
書き込み日時:2005年 12月04日 13:04:40

と表示されるところが、

お名前:?g????/li>
メッセージ:?X????/li>
書き込み日時:2005年 12月04日 13:04:40

と表示されてしまいます。
fgets($file,4096))にしたけど、ダメでした。
どうすれば良いでしょうか?

投稿日時 - 2005-12-05 00:47:03

ANo.1

そういう処理をする場合は EUCかSJISか、文字コードを統一させる事が大前提ですよ

もしくは、どうしてもDATファイルをEUC、ソースをSJISと使い分けたいのであれば、文字コードを変換して読み書きしなければなりません

投稿日時 - 2005-12-04 06:15:40

補足

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

投稿日時 - 2005-12-04 07:39:33

お礼

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です。
どうすれば直りますでしょうか?
本当に困ってます。
どうか宜しくお願い致します。

投稿日時 - 2005-12-04 08:05:50

あなたにオススメの質問