• ベストアンサー

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

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> 以上ですが、宜しくお願い致します。

  • rad6
  • お礼率88% (103/117)
  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • テキスト記録時の文字コード

    PHPの勉強を始めて、テキストベースのゲストブックを作るところまできました。 書き込んだデータが、○●.dat に記録されるんですが、これをダウンロードすると、書き込んだ情報が文字化けします。 日付、時間の部分は正常なのですが、これはどうしてなのでしょうか。。。 初心者故、全く検討もつきません。 宜しくお願い致します。 (念のためソース:) *1.php* <html> <head> <title>ゲストブック</title> </head> <body> <h1 style="background:#cccccc">ゲストブック書込み</h1> <form method="POST" action="2.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> *2.php* <?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"); ?>

    • ベストアンサー
    • PHP
  • textareaに改行を入れても、CSV上では一セルに収まる方法は?

    結論から言いますと、 textareaに改行を入れると、CSVファイルが下段に移ってしまいます。 やりたいとこ textareaに改行を入れても、CSV上では一セルに収まってほしいです。 いろいろ調べたのですが、以下のどこを書き換えればよいか分からないんです。 初心者なため困っております。宜しくお願い致します。 △△△△△△△△△△△△△△△△ ファイル名:input.php ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ <html> <head> <title>インプット</title> </head> <body> <h1 style="background:#cccccc">(書き込み)</h1> <form method="POST" action="write.php"> お名前: <input type="text" name="name" size="20" maxlength="30" /><br /> メッセージ: <textarea name="message" rows="4" cols="40">ここに感想を記入してください。</textarea> <br /> <input type="submit" value="送信" /> </form> </body> </html> △△△△△△△△△△△△△△△△ ファイル名:write.php ▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽▽ <?php $file=fopen("good.csv","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: input.php"); ?>

    • ベストアンサー
    • PHP
  • ゲストブック作成について

    ただいま、PHPを勉強しているものです。 フォームから入力された名前・メッセージ・書き込み日時をテキストファイルに記録するといった内容なのですが、入力フォームは正しく作れています。しかし、その後「Parse error: syntax error, unexpected T_VARIABLE in C:\Program Files\Apache Software Foundation\Apache2.2\***\***\guest_write.php on line 4 」 といったエラーメッセージがでてしまいます。 <?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."\r\n"); flock($file,LOCK_UN); fclose($file); //ファイルのクローズ header("LOcation: guest_input.php"); ?> ある教科書本の通りで間違いはないのですが、php.iniの設定等に不具合があるのでしょうか?教えてください。お願いします。

    • 締切済み
    • PHP
  • 実行結果が文字化けしてしまいます・・。

    PHPは初心者で現在勉強中です。 とあるサンプルを真似して、以下の簡単なクイズを作成していましたが、 実行結果(データpost後の回答表示)が「筝罩hВ鐚」と文字化けしてしまいます。 どこがおかしいか、また、本来どのように描くべきなのか教えて頂けないでしょうか。 宜しくお願い致します。 ------------------------------------------------------------------------- <?php // クイズ $quiz = array( 'question'=>'海は何色?', 'options'=>array('赤', '青', '金', '銀', '黒'), 'answer'=>2); if ($_SERVER['REQUEST_METHOD']=="POST") { $message = ($quiz['answer'] == $_POST['answer']) ? "正解" : "不正解"; echo $message; exit; } ?> <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>PHPの練習</title> </head> <body> <h1>PHPの練習</h1> <form action="" method="post"> <p>Q. <?php echo $quiz['question']; ?></p> <ul> <?php foreach ($quiz['options'] as $key => $value) : ?> <li><input type="radio" name="answer" value="<?php echo $key; ?>"> <?php echo $value; ?></li> <?php endforeach; ?> </ul> <input type="submit" value="回答"> </form> </body> </html>

    • ベストアンサー
    • PHP
  • phpでエラーが出て開発が進みません

    今、ファイルを指定してそのファイルを開き、表示するというプログラムを作っています。 それで Warning: file(): Filename cannot be empty in /home/runner/245ch/core.php on line 94 Warning: array_reverse() expects parameter 1 to be array, bool given in /home/runner/245ch/core.php on line 96 というエラーが出てしまいますどうか回答お願いします。 プログラムは <?php $i; $counter = 0; $filename = 'ip制限.dat'; // fopenでファイルを開く('r'は読み込みモードで開く) $fp = fopen($filename, 'r'); // fgetsでファイルを読み込み、変数に格納 $lines = file($filename, FILE_IGNORE_NEW_LINES); for($i = 0; $i <50 ; $i++){ if($lines[$counter] == $_SERVER["HTTP_X_FORWARDED_FOR"]){ header("location: https://245ch.teamperaggu.repl.co/ihan.html"); }; $counter = $counter + 1; } fclose($fp); // ファイルの指定 //エスケープする関数 function h($s){ return htmlspecialchars($s,ENT_QUOTES,'UTF-8'); } if(isset($_POST["sentaku"])){ $dataFile = trim($_POST['filee']) . ".dat"; $rr = trim($_POST['filee']) . ".dat"; } if(isset($_POST["kousin"])){ $message = trim($_POST['message']); $user = trim($_POST['user_name']); $ip = $_SERVER["HTTP_X_FORWARDED_FOR"] ; file_put_contents("ip.dat","user ". $user ." ". $ip . "\n", FILE_APPEND); //messageが空じゃなかったら if(!empty($message)){ //userが空の場合、名無しにする if(empty($user)){ $user = "名無し"; } //日付を取得する $postDate = date('Y-m-d H:i:s'); //ファイルに書き込むメッセージを作成する $newData = " /名前/ ". $user." /メッセージ/ ".$message." /時間 /".$postDate."\n"; //ファイルを開く $fp = fopen($dataFile,'a'); //ファイルに書き込む fwrite($fp,$newData); //ファイルを閉じる fclose($fp); } } //name="send_message"のPOST送信があった時 if(isset($_POST["send_message"])){ //送信されたname="message"とname="user_name"の値を取得する $message = trim($_POST['message']); $user = trim($_POST['user_name']); $ip = $_SERVER["HTTP_X_FORWARDED_FOR"] ; file_put_contents("ip.dat","user ". $user ." ". $ip . "\n", FILE_APPEND); //messageが空じゃなかったら if(!empty($message)){ //userが空の場合、名無しにする if(empty($user)){ $user = "名無し"; } //日付を取得する $postDate = date('Y-m-d H:i:s'); //ファイルに書き込むメッセージを作成する $newData = " /名前/ ". $user." /メッセージ/ ".$message." /時間 /".$postDate."\n"; //ファイルを開く $fp = fopen($dataFile,'a'); //ファイルに書き込む fwrite($fp,$newData); //ファイルを閉じる fclose($fp); } } //一行ずつデータを取り出して配列に入れる $post_list = file($dataFile,FILE_IGNORE_NEW_LINES); //逆順に並べ替える $post_list = array_reverse($post_list); ?> <style> a.text { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 50; font-size: 25px; } a.test { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 200; font-size: 25px; } a.test { position: absolute; /*自由に配置する指定*/ bottom: 0; /*下寄せの指定*/ right: 200; font-size: 25px; } </style> <body> <h1>掲示板へようこそ</h1> <!--ここで投稿内容を送信する--> <form action="" method="post"> <from method="post"> <input type="text" name="filee"> <input type="submit" name="sentaku" value="選択"> </from> メッセージ:<input type="text" name="message"> ユーザー名:<input type="text" name="user_name"> <input type="submit" name="send_message" value="投稿"> <input type="submit" name="kousin" value="更新"> </form> <h2>投稿一覧</h2> <ul> <!--post_listがある場合--> <?php if (!empty($post_list)){ ?> <!--post_listの中身をひとつづつ取り出し表示する--> <?php foreach ($post_list as $post){ ?> <li><?php echo h($post); ?></li> <?php } ?> <?php }else { ?> <li>まだ投稿はありません。</li> <?php } ?> </ul> <a class="text" href="kiyaku.html">利用規約</a> <a class="test" href="otoiawase.php">お問い合わせ</a> </body>

    • ベストアンサー
    • PHP
  • ファイルのアップロードで文字化けします

    ファイルのアップロードを行うと特定文字以降の名前が消えてしまいます。 (予、表など2バイトコードに5Cが含まれる文字) コードは下のように書いています。 <form enctype="multipart/form-data" action="upload_fnc.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <input name="userfile" type="file"> <input type="submit" value="Send File"> </form> サーバの動作環境はLinux(FedoraCore3)、Apache2.0.52、PHP4.3.10です。 クライアント側はほとんどがWindows(2000、XP)です。 どのようにして対処すればよいか分からなく困っています。 どなたかお分かりの方がいらしたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • htmlが文字化け

    掲題の件について質問させて頂きます。 linuxサーバ(CentOs5)を立ち上げて、apacheをインストールし、DocRootにhtmlファイルをFFFTPにてアップロードした所、文字化けが発生してしまいました。(画面が真っ白になります) 【環境】 Server: Apache/2.2.6 (Unix) mod_ssl/2.2.6 or_log PHP/5.1.6 【アップロードしたファイル内容】 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>ここにタイトルを挿入</title> </head> <body> <form method="post" action="input_check.php" name="input_check"> <input type"text" name="name">お名前: <input type"text" name="furigana">ふりがな: <input type="submit" name="send" value="submit"> </form> </body> </html> ファイルはEUC-JPにて記述しています。 以下試した点をあげてみます。 1. charsetをShift_JISに変更。 ⇒ファイルがEUC_JPで書かれているので当然文字化け。ですが文字化けされた文字は表示されました。(画面が真っ白ではないです。) 2. apacheのhttpd.confのAddDefaultCharsetをコメントアウト ⇒(というよりデフォルトで設定されていませんでした。) 他に何か怪しまれる点はありますでしょうか? 以上宜しくお願い致します。

  • MySqlに登録したデータを更新すると文字化けする

    PHP5.2 MySql5.1.34 文字コードSJIS MySqlに登録したデータを更新すると文字化けします。 回答をよろしくお願い致します。 // MySQLのクライアントの文字コードをsjisに設定 mysql_query("SET NAMES 'sjis'") or die("can not SET NAMES sjis"); // データを取り出す $sql = "SELECT created_at, mes, url FROM message WHERE (id = ".$_POST["id"].");"; $res = mysql_query($sql, $conn) or die("データ抽出エラー"); $row = mysql_fetch_array($res, MYSQL_ASSOC); // 取り出したデータを表示する print "<form action=koushin.php method=post accept-charset=\"Shift_JIS\">"; print "日付:<input type=text size=30 name=created_at value=" . $row["created_at"] . "> "; print("<br>"); print("<br>"); print "メッセージ:<input type=text size=50 name=mes value=" . $row["mes"] . "> "; print("<br>"); print("<br>"); print "URL:<input type=text size=80 name=url value=" . $row["url"] . "> "; print "<input type=hidden name=id value=" .$_POST["id"]. ">"; print("<br>"); print("<br>"); print "<input type=submit value=更新>"; print("<br>"); print("<br>"); print "</form>"; koushin.php <?php $sv = "サーバ"; $dbname = "データベース"; $user = "ユーザー"; $pass = "パスワード"; $conn = mysql_connect($sv, $user, $pass) or die("接続エラー"); mysql_select_db($dbname) or die("接続エラー"); $id = $_POST["id"]; $created_at = $_POST["created_at"]; $mes = $_POST["mes"]; $url = $_POST["url"]; $sql = "UPDATE message SET updated_at = now() , created_at = '{$created_at}' , mes = '{$mes}' , url = '{$url}' WHERE id = $id"; $res = mysql_query($sql, $conn) or die("更新エラー"); mysql_close($conn); ?>

    • ベストアンサー
    • MySQL
  • 文字列(×と÷)の文字化けについて

    phpを勉強している初心者です。 2つのテキストボックスを作って、 各数値を「架ける」または「割る」計算処理ができるように記述しています。 index.phpのフォーム部分は下記のようになっています。 <form method="post" action="test.php"> 入力欄1:<input type="text" name="number1"><br> <input type="radio" name="kigou" value="×">× <input type="radio" name="kigou" value="÷">÷<br> 入力欄2:<input type="text" name="number2"><br> <input type="submit" value="計算"> </form> test.phpの処理部分は下記のようになっています。 <?php if($_POST["kigou"] == "×" ){ $answer=$_POST["number1"]*$_POST["number2"]; }elseif($_POST["kigou"] == "÷" ){ $answer=$_POST["number1"]/$_POST["number2"]; } print $_POST["number1"].$_POST["kigou"].$_POST["number2"]."=".$answer; ?> しかし、結果では、記号部分が文字化けしてしまいました。 (例:4テ4=16、4テキ4=1) HTMLの特殊記号を試しに設定してみましたが 計算すらしてくれなくなりました。 (&times;と&divide;) こんな場合、どうすれば良いのでしょうか? また、if分の条件式にはHTMLの特殊記号は使えないのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • ファイル選択ダイアログでファイルの種類を指定する方法

    下記のプログラムでファイル選択のダイアログを表示しますが 【ファイルの種類】をデフォルトでCSVの指定はできますか? よろしくお願いします。 <html> <body> <form enctype="multipart/form-data" action = "test_02.php" method = "post" > <input type="file" name="file_data1"> <input type="submit" name="FILE送信" value="FILE送信"> </form> </body> </html>

    • ベストアンサー
    • HTML

専門家に質問してみよう