プロが教える店舗&オフィスのセキュリティ対策術

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>

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

A 回答 (3件)

試しに、


<li>お名前:<?php print(mb_convert_encoding($datum[1],"SJIS","EUC-JP")); ?></li>
とかしてみたら
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/12/04 13:10

どのように出力されるはずが、どのように出力されているんでしょう?


文字コードによる文字化けなら何がどのように化けているのか、その文字をみれば大体分かると思います。

勘ですと

fgets($file,1024))

ここを

fgets($file,4096))

にすると直ったり。

この回答への補足

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

補足日時:2005/12/05 01:22
    • good
    • 0
この回答へのお礼

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

と表示されるところが、

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

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

お礼日時:2005/12/05 00:47

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



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

この回答への補足

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

補足日時:2005/12/04 07:39
    • good
    • 0
この回答へのお礼

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!