HYMLファイルの書換えに伴う文字化け

このQ&Aのポイント
  • 共有サーバーで複数のドメインを管理・運営しており、各ドメインのindex.htmlの内容を書換えたいと考えています。しかし、PHPの指定文字コードとHTMLの文字コードの不一致のため、実行すると文字化けが発生してしまいます。
  • un_txt.phpというファイルにアクセスすることで、各フォルダ内にあるindex.html内の内容を書換えたいと思っています。しかし、PHPはEUCで指定されており、書換えたいHTMLファイルはShift-JISとなっているため、文字化けが発生します。
  • 現時点でのスクリプトの問題点を指摘してほしいです。
回答を見る
  • ベストアンサー

HYMLファイルの書換えに伴う文字化け

質問させて下さい。 共有サーバーで複数のドメインを管理・運営しており、各ドメインのindex.htmlの内容を書換えたいと考えております。 サーバーのディレクトリ構造はこんな感じ。 public_html  |  |- sample1.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample2.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample3.com(フォルダ)  |     |  |     + index.html(Shint_JIS)  |  |- sample4.com(フォルダ)  |    |  |    + index.html(Shint_JIS)  |  +-un_txt.php(実行ファイル EUC-JP) この上記構成にある、un_txt.phpというファイルにアクセスすることで、各フォルダ内にあるindex.html内の内容を書換えたいと思っているのですが、PHPはEUCで指定しており、書換えたい各htmlファイルはShift_JISとなっているためか、実行すると文字化けが発生してしまいます。 以下は現時点てのスクリプト、そのままですが、どこがおかしいのかご指摘頂くことは可能でしょうか? <?php $text_data = array("ホームページ", "アイフォン", "スマートフォン"); $array = scandir("./"); mb_convert_variables("EUC-JP", "SJIS", $array); for($i=0; $i<count($array); $i++){ $name = trim($array[$i]); $dir_name = "./".$name; $html = "./".$name."/index.html"; if(is_readable($html)){ @chmod($html, 0606); $addstr = file_get_contents($html); $fp=@fopen("$html","r"); $no = ''; if($fp){ $main = ""; while (!feof($fp)){ $no++; $main .= fgets($fp,1000); } } for($m=0; $m<count($text_data); $m++){ $txt = $text_data[$m]; $no_txt = " "; //$text_data配列に登録されているキーワードを削除。 //削除出来ないため、$no_txt では半角スペースを与えている。 $main = strtr($main, $txt, $no_txt); } $main = mb_convert_encoding($main,"SJIS","EUC-JP"); $fp=fopen($html, "w"); fputs($fp,$main); fclose($fp); } } 以上、お忙しい中恐縮ですが、お知恵を頂戴出来れば幸いです。 宜しくお願い申し上げます。

  • pedm
  • お礼率50% (3/6)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>$main = mb_convert_encoding($main,"SJIS","EUC-JP"); EUC-JPからSJISにして書き込もうとされているようですが、そもそも(SJISのファイルを読んでから)EUC-JPにしてもいないのに戻すというのが謎です。またfile_get_contentsで読んだまま$addstrを放置しているのもちょっと意図がわかりませんし、こういう置換の用途にはstrtrは使いにくいのではとも思います(マニュアルでどういう関数なのかを確認すれば、まず使わないと思うのですが。 http://jp.php.net/manual/ja/function.strtr.php >from と to の長さが異なる場合、長い方の余分な文字は無視されます。 返される文字列の長さは、もとの str と同じになります。 マルチバイト関数を使っていないのであれば、先に$text_dataをSJISにしてしまってもいいように思います。 <?php $text_data = array("ホームページ", "アイフォン", "スマートフォン"); mb_convert_variables('SJIS', 'EUC-JP', $text_data); $array = glob('*', GLOB_ONLYDIR); foreach ($array as $dir) { $file = $dir . "/index.html"; if (!is_readable($file)) { die('not readable ' . $file); } if (!is_writable($file)) { die('not writable ' . $file); } $source = file_get_contents($file) or die('cannot read ' . $file); foreach ($text_data as $text) { $source = str_replace($text, '&nbsp;', $source); } file_put_contents($file, $source) or die('cannot write ' . $file); }

pedm
質問者

お礼

shimix様 ご親切なアドバイスをありがとうございます。 また的確なご指摘をありがとうございます。 このソースですが他のソースからの流用だったため、file_get_contentsなど一部が残ったままとなっていました。 質問投稿後、見直すことで文字化けも直っておりましたが、shimix様のスマートなソースを参考に勉強させて頂こうと思います。 この度はご親切なアドバイスをありがとうございました。

関連するQ&A

  • DLしたファイルの文字化けについて

    こちらのサイトで、使用したいプラグインがあり、『update01.zip』というフォルダをDLしました。 http://www.a-kojima.net/set/index.php?%C4%C9%B2%C3%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3 ところが解凍してみると、中の「プラグインアップデート.txt」が文字化けしてしまっていて説明を読むことができません。 同梱されていた.phpもワードパットで開いてみたのですが文字化けしています。 (フォルダ名・ファイル名は異常ないようです) サイトの管理人さんに問い合わせようかと思ったのですが、メールがわからず、またBBSもパスワード制で連絡が取れないようです。 文字化けしているファイルを正しく読む方法はないでしょうか。 関係ないかもしれませんが、IE7に変えてからエンコードが日本語自動選択(JIS)からUnicodeに変わっています。 自動選択(JIS)では文字化けしてしまい、(EUC)では画面が真っ白になります。 文字化けと関係あるでしょうか。

  • HTML・PHPの文字化け

    こんにちは。 PHPとMySQLを使ってショッピングカートを作ろうと思ったのですが、しょっぱなから躓いてしまいました・・・。 index.htmlでメタを <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> とeuc-jpにしたのですが、サーバーにアップすると文字化けしてしまいます。 表示のエンコードで確認するとシフトーJisになっています。eucにするとちゃんと表示されるのですが、更新するとやはり文字化けします。PHP・MySQLがeucですので、困っています。 どうにか対処方法はないでしょうか?ご教授をよろしくお願いします。

    • ベストアンサー
    • HTML
  • C言語でのファイル検索&ファイル書き換えについて

    C言語である特定のフォルダを指定して、その階層内(サブフォルダも含む)にあるファイル、例えばsample_nameをファイル名に含むファイルを見つけ、そのファイル内の例えば下のような書き換えを行えるようなプログラムはどうつくればいいのでしょうか。 元ファイル ~sample_name1.txt~ aaa, 10 bbb, 20 ccc, 30 ~sample_name2.txt~ aaa, 30 ccc, 12 bbb, 20 ddd, 15 上のように各ファイルにaaaやbbbが共通に含まれています。 対象ファイル:sample_name 対象文字列:aaa 変換後:100 変換後ファイル ~sample_name1.txt~ aaa, 100 bbb, 20 ccc, 30 ~sample_name2.txt~ aaa, 100 ccc, 12 bbb, 20 ddd, 15

  • 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をコメントアウト ⇒(というよりデフォルトで設定されていませんでした。) 他に何か怪しまれる点はありますでしょうか? 以上宜しくお願い致します。

  • 文字コード(UTF-8)文字化けについて

    以下のphpを実行したところ、入力した文字によって文字化けしたりしなかったりします。 どなたか原因が分かる方がいらっしゃったら教えてください。 (見、一は化けない。上、実は化ける。) phpはバージョン5.2.8を使用しています。 (コード)----------------------- <html lang="ja"> <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> <head> </head> </body> <?php mb_language("Japanese"); mb_internal_encoding("UTF-8"); $org_text1 = "見"; $org_text2 = "上"; $org_text3 = "実"; $org_text4 = "一"; $telop_text1 = mb_convert_encoding($org_text1,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text2 = mb_convert_encoding($org_text2,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text3 = mb_convert_encoding($org_text3,'utf-8','ASCII, JIS, EUC-JP,SJIS'); $telop_text4 = mb_convert_encoding($org_text4,'utf-8','ASCII, JIS, EUC-JP,SJIS'); echo "telop_text1="; echo $telop_text1; echo "<br>"; echo "telop_text2="; echo $telop_text2; echo "<br>"; echo "telop_text3="; echo $telop_text3; echo "<br>"; echo "telop_text4="; echo $telop_text4; ?> </body> </html> (結果)------------------------- telop_text1=見 telop_text2= telop_text3=タ telop_text4=一

    • ベストアンサー
    • PHP
  • テキストデータから指定行の削除

    phpでサイトを作っています。 テキストデータを一行ずつ表示させ、指定した行を削除したいのですが、どうすればいいのでしょうか? -- data.txt -- aaa,data1, bbb,data1, ccc,data1, ddd,data1, -- php -- <?php $del=$_POST['del_no']; if($del!=""){ $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); if($data_array[0]!=$del){//削除データ以外を再書き込み $txt="$data_array[0],$data_array[1],\n"; $fp = fopen("data.txt", "w"); flock($fp,1); foreach ($txt as $line) {// 1行ずつファイルへ書き込み? fwrite($fp, $line); } fclose($fp); break; } } } ?> <b>data list</b> <? $data_all = file("data.txt"); for($i=0;$i<count($data_all);$i++){ $data_array = explode(",",$data_all[$i]); echo "$data_array [0]<br />"; echo "<form method=\"post\">"; <input type=\"hidden\"name=\"del_no\" value=\"$data_array[0]\" />";//削除するデータをPOST echo "<input type=\"submit\" value=\"削除\" />"; echo "</form>"; } ?> こうすると、テキストデータが白紙になってしまいます。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列の中に一部の文字があるかどか確認したい。

    <? header("Content-Type: text/html; charset=EUC"); $sample = array('test1' => "aaa 000 222 333" ,'test2' => "b 555 888 999",'test3' => "c 777 111 10"); if(in_array("222",$sample)){ echo "●"; } if(in_array("aaa 000 222 333",$sample)){ echo "○"; } ?> というようにPHPを記述すると「○」はでるのですが、 「●」がでません。 eregのように配列の中に一部の文字があるかどうかを確認する場合はどうしたらよいのでしょうか。

    • 締切済み
    • PHP
  • 更新を繰り返すと文字化けが起きてしまいます...

    お世話になります PHP4でHPを作成しています 文字化けに関して質問させて下さい PHPで作成したページの更新をすると 5回に1回の割合で文字化けが発生してしまいます EUC-JPで作成したPHPファイルを表示するので ファイルの先頭に  <? header(\"Content-Type: text/html;charset=EUC-JP\"); ?>  <html lang=\"ja\">  <head>  <meta http-equiv=\"content-type\" content=\"text/html; charset=EUC-JP\">  <meta http-equiv=\"content-style-type\" content=\"text/css\">  <meta http-equiv=\"content-script-type\" content=\"text/javascript\"> と指定してから 他の処理が実行されるようにしているのですが…。 何回か更新を繰り返すと文字化けを起こしてしまいます。 文字化けを起こした時にソースを表示すると 日本語が正しく見れる状態になっていたので シフトJISになってしまっているようで… 宜しくお願いします

    • 締切済み
    • PHP
  • CSVファイルへの書き込み:文字化けしてしまいます

    こんにちわ。 HTMLファイルから送られてきた3つのデータ(toi,kotae,yomi)を サーバ上のCSVファイルに書き込むプログラムを作りましたが、文字化けしてしまいます。 尚、同じプログラムをPC内のXAMPP環境で動かしていた際は、文字化けは起こりませんでした。 開発は「メモ帳」で行っています。 よろしくお願いいたします。 ***** ↓クライアント側のHTML <html> <head> <title>send data</title> </head> <body> <form name = "myform" action = "data_to_csv.php"> 問い: <input type = "text" name = "toi" value = ""><br> 答え: <input type = "text" name = "kotae" value = ""><br> 読み: <input type = "text" name = "yomi" value = ""><br> <p> <input name= "mybutton" type="submit" value="click" > </form> </body> </html> ***** ↓サーバー側のプログラム <html> <head> <title>the item added to the csv file</title> </head> <body> The items were sucessfully added to the CSV file.<br> <?php $toi = $_REQUEST['toi']; $kotae = $_REQUEST['kotae']; $yomi = $_REQUEST['yomi']; $lines=array($toi, $kotae, $yomi); $lines=implode(",", $lines); $lines=$lines."\n"; //write to a csv file $fp=fopen("data.csv", "a"); // flock($fp, LOCK_EX); fputs($fp, $lines); fclose($fp); ?> </body> </html>

    • 締切済み
    • PHP
  • 【PHP】 書込みされた事を知らせる為のアイコン表示

    私の理想のイメージは、abc.php ファイルの掲示板に書込み(新規・返信)されたら、zyx.php ファイルの方で その abc.php ファイルの掲示板で書込みされた事を知らせる為のマーク up.gif (アイコン)を、書き込まれた日から 24時間(1日)の間表示させたいのです。 ◆ log.txt ファイル(掲示板の書込みログ) 1,みかん君,2008/04/16 15:19:14 ・ 3,りんご君,2008/04/13 22:19:32 ・ ・ 6,ぶどう君,2008/04/11 08:19:48 ・ ・ 以下省略 【 log.txt ファイルの補助説明 】 ※ 「 , 」(カンマ)で区切りを付けてます。 ※ インデックス,名前,日付 と言う順に配列がなっています。 ※ log.txt ファイルは、上から最新順に書き込まれるようにしてあります。 ※ インデックス($no) 名前($name) 内容($date)と配列がなっています。 ◆ abc.php ファイル(掲示板ページ) $fp = fopen("log.txt","a"); flock($fp, LOCK_EX); $data = implode( "," , array($no,$name,$date."\n") ); fputs($fp,$data); flock($fp, LOCK_UN); fclose($fp); 【 log.txt ファイルの補助説明 】 ※ 掲示板での書き込み処理です。 ◆ zyx.php ファイル(up.gif (アイコン)を表示させたいページ) <? $files = file("log.txt"); $logdata = $files[0]; list($no,$name,$date) = explode( "," , $logdata); if($no != ){ } ?> ここまではやってみましたが、ここから、どのようにしたらよいのか分らないので教えて下さい? また、if で、どのように条件を定義してよいかも分りません。宜しくお願い致します。

    • ベストアンサー
    • PHP