• ベストアンサー
  • 暇なときにでも

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

  • 質問No.1818274
  • 閲覧数212
  • ありがとう数3
  • 回答数3

お礼率 88% (103/117)

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>

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

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

  • 回答No.2
  • ベストアンサー

ベストアンサー率 50% (3003/5914)

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

お礼率 88% (103/117)

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

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 73% (192/263)

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

勘ですと

fgets($file,1024))

ここを

fgets($file,4096))

にすると直ったり。
補足コメント
rad6

お礼率 88% (103/117)

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

お礼率 88% (103/117)

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

と表示されるところが、

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

と表示されてしまいます。
fgets($file,4096))にしたけど、ダメでした。
どうすれば良いでしょうか?
投稿日時:2005/12/05 00:47
  • 回答No.1

ベストアンサー率 33% (1229/3720)

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

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

お礼率 88% (103/117)

すみません。一部説明不足でした。
『文字コードはEUC、PHPの出力はSJIS。』
とは、PHPファイルをEUCで保存し、出力をphp_value mbstring.http_output SJISで設定しているという意味です。
投稿日時:2005/12/04 07:39
お礼コメント
rad6

お礼率 88% (103/117)

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

その他の関連するQ&Aをキーワードで探す

ページ先頭へ