プログラムのログを活用して別のプログラムで利用する際の文字コード変換と改行方法について

このQ&Aのポイント
  • あるサイトで見つけたプログラムのログを活用して別のプログラムで利用する際に、文字コードを変換する方法を教えてください。
  • また、書き込んだログがべたでつながっているため改行したいです。
  • どうかよろしくお願い致します。
回答を見る
  • ベストアンサー

この先困っています。

この先困っています。 あるサイトで下記プログラムを見つけましたが その先で困っております。ご教授お願い致します。 ------------------------------ <?php //書き込みファイル設定 $filename = "log.txt"; $fp = fopen($filename, "w"); //ログファイル配列処理 $arr = file("./manager/data.dat"); //書き込み開始 foreach ($arr as $line) { $lines = explode("&&", $line); fwrite($fp, $lines[1]); $lines[1]= mb_convert_encoding($lines[1], "Shift_JIS", "EUC"); //echo "<a href=$lines[1]>".$lines[1]."</a></br>\n\n\n"; } //書き込み終了 fclose($fp); ?> ------------------------------ 1.EUCでかかれた下記ログを読み込みShift_JISに文字変換したい。       $arr = file("./manager/data.dat");//EUC       $filename = "log.txt";//shift_JIS に変換したい 2.書き込んだログがべたでつながっているので改行したい。        fwrite($fp, $lines[1]);//改行で保存したい あるプログラムのログを活用して別のプログラムで利用したいのですが 文字コードで困っています。 どうかよろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.1

困るような内容でしょうか‥‥? 検証してないけど、これでいいと思います。 //書き込み開始 foreach ($arr as $line) { $lines = explode("&&", $line); $lines[1]= mb_convert_encoding($lines[1]."\n", "Shift_JIS", "EUC"); fwrite($fp, $lines[1]); } //書き込み終了 fclose($fp); ?> ------------------------------

100POINT
質問者

お礼

無事解決いたしました。 $lines[1]= mb_convert_encoding($lines[1]."\n", "Shift_JIS", "EUC"); ここに改行を $lines[1]."\n", 入れることは全然わかりませんでした。 本当にありがとうございました。

関連するQ&A

  • 任意の行を修正し、ファイルを上書きしたいのですが…

    <html> <head> <title>修正・変更</title> </head> <body> <?php  $aaa = $_POST['aaa'];  $bbb = $_POST['bbb'];  $ccc = $_POST['ccc'];  $dummy = $_POST['hidden'];  $lines = array($aaa, $bbb, $ccc,$dummy);  $lines = implode(",", $lines);  $lines = mb_convert_encoding($lines, "SHIFT-JIS" , "EUC-JP");  $file = file('sample.csv');  $file[$i] = $lines."\n";  $fp = fopen("sample.csv","w+");  for($i=0 ; $i<count($file) ; $i++) {   flock($fp, LOCK_EX);   fwrite($fp, $file[$i]);  }  fclose($fp); ?> <div align="center"> 修正・変更しました!! <br><br> <input type="button" name="button" value="戻る" onClick="location.href='aaa.php'"> </div> </body> </html> 上記の様なプログラムを「CSVファイルを書き込む方法」を基に書いて みました。 しかしながら、どうしても任意の行のデータを修正して上書きする ことができません(涙 どうやったら任意の行のデータかどうかを認識して、上書きする事が できるのでしょうか?? 皆様お忙しい中かとは思いますが、ご教授して頂けませんでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • fwrite の文法が間違っていますか?

    どうしてもエラーになってしまいます どこが間違っているかお教え頂けませんでしょうか 宜しくお願い致します $fp_i = fopen($indexphp, "w"); fwrite($fp_i, "<html>\n<head>\n"); fwrite($fp_i, "<title>title</title>\n"); fwrite($fp_i, "<meta http-equiv=\"content-type\" content=\"text/html; charset=Shift_JIS\">\n"); fwrite($fp_i, "</head>\n"); fwrite($fp_i, "<body>\n"); fwrite($fp_i, "<?php\n"); fwrite($fp_i, "$txt = 'test'\n"); fwrite($fp_i, "print'($txt)';\n"); fwrite($fp_i, "?>\n"); fwrite($fp_i, "</body>\n"); fwrite($fp_i, "</html>");

    • ベストアンサー
    • PHP
  • ■が増えていく。

    ログファイルに文字を書き込むという単純なphpファイル(uho.php)について、 ******* <?php $LINES = file('log.dat'); if ($_POST['write']) write(); function write(){   global $LINES;   $contents = $_POST['contents'];   $data = "$contents<>\n";   array_unshift($LINES, $data);   $FILE = fopen('log.dat', 'w');   $log= implode("",$LINES);   fputs($FILE,$log);   fclose($FILE); } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> </head> <body> <form method="post" action="uho.php"> <textarea name="contents" cols="60" rows="5"></textarea><br> <input type=submit name=write value=aaaa> </form> <? for($i=0; $i<count($LINES) ; $i++) print $LINES[$i]."<br>"; ?> </body> </html> ***** と記述しました。 phpエディタは、「phpエディタ standalone」を使用していて、文字コードはEUCがいいとのことですが、参考にしているサイトのPHPスクリプトがShift_JIS形式で作成しているようなので、とりあえずShift_JISで保存しています。ApacheやPHP等の環境を一気にインストールできる「phpdev423」を用いてWin XP上で走らせていることにより動作確認をしています。 それで困っていることがあるのですが、どうやら文字を転送すると、ログファイルをメモ帳でひらくと、 aaaa<> bbbb<> cccc<>■ dddd<>■■ eeee<>■■■ ffff<>■■■■ という風に■が並んでいきます。実際の■ではなく、これより幾分か小さい黒い正方形が表示されます。 このログファイルにさらにもじを書き足した場合、 1111<> aaaa<> bbbb<>■ cccc<>■■ dddd<>■■■ eeee<>■■■■ ffff<>■■■■■ となります。なぜこういった現象が起こるかがわかりません。

    • ベストアンサー
    • PHP
  • テキストエリアの改行について

    PHP初心者です。 今、PHPで掲示板を作成しています。 下記のように テキストエリアで複数行文字を打っても、 1行で表示されてしまいます。 -----入力----- <textarea> Test Test </textarea> -----出力----- Test Test -------------- どうしたら、改行が反映されるのでしょうか? プログラム貼り付けておきますね! -------------------------------- <form method="post" action="<? echo $PHP_SELF; ?>"> 名前<br><input name="name" type="text" size="10"><br> コメント<br><textarea name="mes" rows="10" cols="50"></textarea><br> <input type="submit" value="送信"><input name="del" type="submit" value="RESET"><br> <?php extract($_POST); /* 設定 */ $ip = getenv("REMOTE_ADDR"); //IPアドレスを取得 $logfile = "bbs.log"; //ログファイル名 $viewmax = 10; //表示行数 $logmax = 10; //保存最大行数 $n_fp = fopen("num.log","r+"); $num = fgets($n_fp, 32); //現在のNo.を取得 /* リセット処理 */ if($del){ $bbs = fopen("bbs.log","w"); //BBSログを消去 fclose($bbs); fclose($n_fp); //ファイルを閉じる $nc_fp = fopen("num.log","w"); //num初期化 $num = 1; fputs($nc_fp, $num); //書き込み fclose($nc_fp); //ファイルを閉じる } /* 書き込み処理 */ if($name && $mes){ /* HTMLタグをエントリに変換 */ $mes = htmlspecialchars ($mes); $name = htmlspecialchars ($name); /* Shift-JISの場合バッククォートを除去 */ if(get_magic_quotes_gpc()){ $mes = stripslashes($mes); $name = stripslashes($name); } /* \nを<br>に変換する */ if($mes == "\n"){ $mes = str_replace("\n", "<br>", $mes); } /* 日付けのフォーマット */ $now = gmdate("d(D) H:i ",time()+60*60*9); /* ログのフォーマット */ $dat = "$name<br>└ $mes <font size=\"1\">[$now]</font><br>($ip)<br>\n"; /* ログに書き込む */ $lines = file($logfile); //いままでのログを配列に読み込む $fp = fopen($logfile, "w"); //ログをオープン(空になる) fputs($fp,"[$num] $dat"); //データを書き込む(先頭に) for($i = 0; $i < $logmax-1; $i++) //いままでの分を追記 fputs($fp, "$lines[$i]"); //(配列0-98→現ログ1-99行目) fclose ($fp); $num++; fseek($n_fp, 0); // ポインタを先頭に戻す fputs($n_fp, $num); // 書き込み fclose($n_fp); // ファイルを閉じる } /* 表示処理 */ $lines = file($logfile); for($i = 0; $i < $viewmax; $i++) echo $lines[$i]; ?> </form>

    • ベストアンサー
    • PHP
  • PHP ファイル操作について

    PHPのファイル操作についてご教授ください 同じサーバー内に置いている同じ環境の別ドメインに設置した 同じPHPの挙動が異なる為、その原因を教えて頂きたいです。 ファイルへ保存した場合の改行の有無についてです。 以下一部を抜粋しています。 初期状態(abc.txtの中身) -----ここから----- すもも<>あんず<>すいか<> -----ここまで----- ▼以下を実行 [入力内容] data01:すもも data02:あんず data03すいか $log_file = 'abc.txt'; $lines = ""; $fp = fopen($log_file, "rb+"); set_file_buffer($fp, 0); flock($fp, LOCK_EX); $freadsize = @fread($fp,filesize($log_file)); $freadsize = chop($freadsize); $lines = explode("\n",$freadsize); $lnum = count($lines); for($i=0;$i<$lnum;$i++){ $lines[$i] = "$lines[$i]\n"; } array_unshift ($lines, "$data01<>$data02<>$data03<>$blank"); rewind($fp); $lnum = count($lines); for($i=0;$i<$lnum;$i++){ if(preg_match("/^[0-9]{10}<>+/",$lines[$i])){$check = 1;}else{$check = 0;} if($check == 1){ fputs($fp,$lines[$i]); } } ftruncate($fp, ftell($fp)); flock($fp, LOCK_UN); fclose ($fp); ▼実行後(abc.txtの中身) りんご<>ばなな<>ぶどう<> すもも<>あんず<>すいか<> 別のドメイン下では、改行されません。 りんご<>ばなな<>ぶどう<>すもも<>あんず<>すいか<> この同じPHPを同じサーバー内の別ドメインで 実行した場合、改行される場合と改行されない場合があるのです。 ドメインが異なる以外は同じ環境のはずなのですが、挙動が異なります。 改行をして保存したいのですが、改行されないドメイン下のPHPは array_unshift ($lines, "$data01<>$data02<>$data03<>$blank"); ↓ array_unshift ($lines, "$data01<>$data02<>$data03<>$blank\n"); としています。 何故挙動が異なるのでしょうか? 文字コード、改行コードは同じです。

    • ベストアンサー
    • PHP
  • flockのタイミング

    掲示板のスクリプトを作っています。 ログは1行ごとに1記事分のデータが格納されているので、書き込み処理の場合は、 $lines = file("./log.dat"); としていったん配列にログを読み込み、 array_unshift($lines, $new_data); 等して、新しい記事のデータを配列の先頭に追加し、 $fp = fopen("./log.dat", "wb"); foreach ($lines as $line) { fputs($fp, $_); } fclose($fp); として、最終的にログに書き込みます。 Perlを扱っているときは(複数更新すべきログファイルがあったので)、別途ロックファイルを作ってそれに対してflockをかけるという方法を行っていましたが、今回はログファイルが1つであるのでそのログファイル自体にflockをかけようと思っています。 しかし、fileで最初にopenしているため、ファイルポインタが取得できず、flockをかけるタイミングは、本当の書き込み作業の部分(fopen)からかけるしかなさそうなのですが、これは危険ではないでしょうか? それと、マニュアルに、 注意: flock()は、ファイルポインタを必要とするため、 (fopen()へ引数"w"または"w+"を指定して)書き込 みモードでオープンすることにより丸めるファイルにアクセス保護する 特別なロックファイルを使用する必要があるかもしれません。 とかいてありますが、この意味がいまいちわからず、困惑しています。

    • ベストアンサー
    • PHP
  • C言語でファイルを出力

    ファイルの中に変数をいれて複数のファイルをつくろうとしたのですが、 できたファイルの後に?マークがついてきます。 file = fopen("filename.txt", "w"); for(j=0; j<30; j++){ fprintf(file ,"%d.dat\n",j ); } fclose(file); file2 = fopen("filename.txt", "r"); として、ファイル名を書いたファイルをつくってから、 for(k=0; k<30; k++){ fgets(fp,sizeof(fp),file2); file_out = fopen(fp,"w"); 省略 fprintf(file_out, %e %e \n",a ,b); fclose(file_out); } fclose(file2); をして、30個のファイルを出力すると、 0.dat? 1.dat? 2.dat? . . . 29.dat? というファイルができてしまいます。 ファイルの中はしっかりできています。 なにか解決法を知っている方がおりましたら、どうか教えて下さい。

  • 新規ファイルを作成する

    にはどうしたらいいのでしょうか? <?php $file='gomi.dat'; $in=isset($_POST['in'])?$_POST['in']:'bad'; if(file_exists("$file")) { $a=file("$file"); foreach($a as $value) { echo "$value<br/>"; } } $fp=fopen("$file","w"); // <-------------- fwrite($fp,"$in\n"); fclose($fp); ?> <form method="post" action="<?= $_SERVER['PHP_SELF'] ?>"> <input type="text" name="in"/> <input type="submit" value="send"/> </form> は動きませんが $fp=fopen("$file","w"); // <-------------- を $fp=fopen("$file","r+"); // <-------------- としてあらかじめ空の gomi.dat (モード777)を作っていれば動きます どうしたら $fp=fopen("$file","w"); // <-------------- にしても動くようになるでしょうか?

    • ベストアンサー
    • PHP
  • 変数からテキストファイルを保存

    サイトのソースを自動で取得するプログラムを考えいます。 その際にどこのサイトから取得したソースなのかをファイル名で整理したいと考えていますが、変数から自動的にテキストファイルを作ることができません。 どなたかお力をお貸し頂ければ幸いです。 それでは宜しくお願いいたします。 cate.txt======= shopping auction sports ============= <?PHP $Data = file("cate.txt"); for($c=0; $c<sizeof($Data); $c++){ //ここがうまく動いてくれません。。。 $filename == "{$Data[$c]}"."."."txt"; for($i=0; $i<1; $i++){ $url = "http://{$Data[$c]}.yahoo.co.jp/page={$i}"; $lines = file($url); $fp = fopen("data.txt","a"); foreach($lines as $newdata){ fwrite($fp, $newdata); } fclose($fp); } } ?>

    • ベストアンサー
    • PHP
  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう