【PHP】ファイル読み込みで「見えない文字」が発生する??

このQ&Aのポイント
  • PHP初心者の質問です。ファイルから文字列を読むとき、先頭に「見えない」文字がついてしまいます。見えない文字とは空白ではなく容積ゼロの文字のことで、一種の文字化けと思われます。
  • 質問者はPHPのプログラムでファイルを開いて文字列を読み込む処理を行っていますが、出力結果に先頭に「見えない」文字が現れます。このような文字は初めての経験でわけがわかりません。予防策があれば教えてほしいとのことです。
  • 質問者はレンタルサーバーでPHP4.4.4を使用しており、ローカルではWin-XPを使用しています。プログラムやデータファイルはUTF-8で書かれています。また、質問者は最後に文字自体を載せようとしましたが「」に変換されてしまったことに疑問を持っています。
回答を見る
  • ベストアンサー

【PHP】ファイル読み込みで「見えない文字」が発生する??

PHP初心者です。 不思議な現象を経験したため質問させていただきます。 ファイルから文字列を読むとき、どうしても先頭に「見えない」文字がついてしまいます。見えない文字とは空白ではなく容積ゼロの文字のことで一種の文字化けと思われます。 <PHPプログラム> <?php header('Content-Type: text/html; charset=UTF-8'); header('Content-Language: ja'); mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); print "ここに発生→"; if($fp = @fopen("file.txt", "r")){ while( !feof($fp) ){ $line = trim(fgets($fp)); print "$line"; } @fclose($fp); } ?> <データファイルfile.txt の中身> ←ここ!1行目 2行目 3行目 <出力結果> ここに発生→←ここ!1行目2行目3行目 出力結果にカーソルを持って行き、矢印キーで動かしていただければ → と ← の間でカーソルが1回動かず、何かが「存在」していることが確認できると思います。 このような文字は初めての経験でわけがわかりません。予防策がありましたらお願いいたします。 <環境> レンタルサーバーはPHP4.4.4(UTF-8) ローカルはWin-XP(3台で確認) プログラムもデータファイルもUTF-8で書いています。 <ほか> その文字自体をここに載せようとしましたが「」に変換されてしまいました。これは一体何でしょう??

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

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

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

65279を十六進表記すると 0xfeff なのでBOMですね。 ということで、php utf-8 bom で検索してみると以下のページが トップに引っかかりました The elephant vanishes PHP http://oubakiou.blog8.fc2.com/blog-category-17.html > それで色々調べてみると、これはPHPのバグらしい。 > > Bug #22108 php doesn't ignore the utf-8 BOM http://bugs.php.net/bug.php?id=22108 > > 対象OSは全て、対象のPHPバージョンは全て、StatusはWont fix。 PHPスクリプトを編集するのに使っているエディタの設定をいじって、 BOMをつけないようにすればよいようです。

ikataro
質問者

お礼

なるほど!!PHPのバグとは!!ヾ(iДi)/ http://sakaguch.com/utf1.html によると、 「保存はBOMなしのUTF-8Nにしなければなりません。」 とあり、単なるUTF-8じゃいかんようです。 実際UTF-8Nで検証したところ「見えない文字は」発生しませんでした。 誠にありがとうございました。

関連するQ&A

  • CSVファイルをダウンロードで文字化け

    こんにちは。 CSVファイルのダウンロードで文字化けを起こしていて困っております。 どなたか助けてくださる方がいらっしゃると大変光栄です。 機種:WindowsXP English ファイル:UTF-8 PHPコードは下記の通りです。 いろいろとHeaderを付けてみたり変えてみたりしましたが、どれも結果は同じでした・・。 Header("Accept-Ranges: none"); Header("Content-Transfer-Encoding: binary"); Header("Content-type: application/x-csv; charset=SJIS-win"); Header("Content-Disposition: attachment; filename=1.csv"); $output = '2007/08/29 こんばんわ'; print mb_convert_encoding($output,'SJIS-win','UTF-8'); アウトプットは下記の通りです。ダブルバイト全てが文字化けしてしまいます。 2007/08/29 ‚ア‚ñ‚ホ‚ñ‚í どなたか解決方法をご存知ないでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • PHPで生成したテキストファイルをダウンロード

    PHPでMySQLデータベースからデータを取得してテキストファイルに出力し、それをダウンロードさせるプログラムを制作しています。 ただ、現在のやり方ではテキストファイル出力時の確認用にprintでページ内に表示させるものが、すべてダウンロードしてきたファイルに書き込まれてしまいます。 ダウンロード処理前に出力されて残っているテキストファイルは正常なので、ダウンロードの設定が悪いのだろうと思いますが、どう設定してやればいいのか分からない状態です。 以下ソース(テキストファイル生成部分などは省略します) <?php /////////////////////////////// //データベースからデータを取得 /////////////////////////////// //ファイルを書き込み専用で開く $file = fopen("sample.txt", 'w'); /////////////////////////////// //printでデータを表示しながらファイルへ出力 /////////////////////////////// //ファイルをクローズ fclose($file); // MySQLに対する処理 $close_flag = mysql_close($link); if ($close_flag){ print('<p>切断に成功しました。</p>'); } download_file("sample.txt"); function download_file($tmp_file) { // ダウンロードさせるファイル名 //$tmp_file = "./sample.txt"; $j_file = "sample.txt"; $j_file = mb_convert_encoding($j_file, "SJIS", "UTF-8"); /* ファイルの存在確認 */ if (!file_exists($tmp_file)) { die("Error: File(".$tmp_file.") does not exist"); } /* オープンできるか確認 */ if (!($fp = fopen($tmp_file, "r"))) { die("Error: Cannot open the file(".$tmp_file.")"); } fclose($fp); /* ファイルサイズの確認 */ if (($content_length = filesize($tmp_file)) == 0) { die("Error: File size is 0.(".$tmp_file.")"); } // ヘッダ header("Content-Type: application/octet-stream"); // ダイアログボックスに表示するファイル名 header("Content-Disposition: attachment; filename=$j_file"); //表示するファイルサイズ header("Content-Length: ".$content_length); header('Pragma: no-cache'); header('Cache-Control: no-cache'); // 対象ファイルを出力する。 readfile($tmp_file); exit; } ?>

    • ベストアンサー
    • PHP
  • PHP+Postgres 「髙」が文字化け

    DB上に格納した文字列を取得し、PHPで出力すると、 「髙」(はしごだか)等、一部の文字が「□・」のような見た目に化けてしまいます。 環境は以下です。 Linux(CentOS 5) PHP 5.1.6 Apache 2.2.3 PostgreSQL 8.4.3 文字コードは以下です。 Postgres:EUC-JP PHPソース:EUC php.ini の[mbstring]はコメントのまま変更していません。 文字コードの変換を試してみたのですが、「髙」としては出力できませんでした。 Windows上では「CP51932」に変換すると正常に出力できましたが、Linux上ではやはり駄目でした。 mb_language("uni"); mb_internal_encoding("euc-jp"); mb_http_input("auto"); mb_http_output("euc-jp"); $str = "髙橋"; print(mb_convert_encoding($str, "EUCJP-win")); print(mb_convert_encoding($str, "EUCJP-win","EUC-JP")); print(mb_convert_encoding($str, "SJIS")); print(mb_convert_encoding($str, "SJIS","EUC-JP")); print(mb_convert_encoding($str, "SJIS-win")); print(mb_convert_encoding($str, "SJIS-win","EUC-JP")); print(mb_convert_encoding($str, "UTF-8")); print(mb_convert_encoding($str, "UTF-8","EUC-JP")); print(mb_convert_encoding($str, "EUC","SJIS")); print(mb_convert_encoding($str, "Unicode")); print(mb_convert_encoding($str, "Unicode","EUC-JP")); print(mb_convert_encoding($str, "UTF-8", "sjis-win")); print(mb_convert_encoding($str, "CP51932")); print(mb_convert_encoding($str, "MS932")); print(mb_convert_encoding($str, "MS932","EUC-JP")); print(mb_convert_encoding($str, "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win" ), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "EUCJP-win","EUC-JP"), "UTF-8","EUCJP-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "UTF-8","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win" ), "EUCJP-win","SJIS-win")); print(mb_convert_encoding(mb_convert_encoding($str, "SJIS-win","EUC-JP"), "EUCJP-win","SJIS-win")); http://blog.livedoor.jp/loopus/archives/50160285.html 上記サイトによると、解決法は「EUC-JPで出力しないこと」という事でしたが、 文字コードを変換して出力できるような事を書いているサイトもあり、結論が出せずにいます。 ソースを書き換えるのは避けたいのですが、いい方法がありましたらご教示ください。

    • ベストアンサー
    • PHP
  • PHPの文字コード変換について

    PHPで mb_convert_encodingを用いて UTF-8で記述されたPHPスクリプトファイルの PHPファイル内の任意の文字列の文字コードを変換する場合、 $value = "文字列"; $str = mb_convert_encoding($value ,"UTF8","UTF8"); print $str; この場合、特に問題なく、変換がおこなわれます というか、意味のないで処理ではありますが。 次に $str = mb_convert_encoding($value,"EUC-JP","EUC-JP"); とした場合 うまく文字列の文字コードの変換がおこなわれず 出力内容は文字化けします。 次に $str = mb_convert_encoding($value,"SJIS","SJIS"); とした場合 EUC-JPと同じく文字コード変換に失敗し 文字化けするだろうとおもいましたが おもいのほかブラウザの文字コードUTF-8のままで文字化けしていないのです。 これはどういう現象でしょうか? たとえば一つ目は UTF8で記述されたPHPファイルの文字列をそのままUTF-8として 変換されせるのですから、問題ないはずです。結果問題ありません。 二つ目は UTF-8でかかれたPHPファイルの文字列をEUC-JPでかかれたファイルとして EUC-JPという文字コードに変換しなさいという命令ですよね? これは思う通りにいかなくて文字化けした文字列が出力されるのはわかるのですが 三つ目はUTF8で記述された文字列をSHIFT-JISとしてSHIFT-JISに変換しようとしているにも かかわらず、結果問題なくブラウザのUTF-8で文字列と表示されてしまいます。 これはいったいどういう事なのでしょうか? これが仮に $str = mb_convert_encoding($value,"SJIS","UTF-8"); なら話は簡単んです。 UTF-8で記述されたファイルの任意の文字列を UTF8からSJISに変換しようとしているのですから問題なく SHIFT-JISでエンコーディングされた文字列が帰ってくるはずです。 こ乃原因をご存知のかたよろしくご教授ください。 お願い致します。

    • ベストアンサー
    • PHP
  • ファイルの文字コードを調べるには?(php)

    言語はphpです。 アップロードしたファイルをからデータを1行ずつ抜き取るという作業をしています。 その際にエンコードを下記の方法で行っています。 $lines = mb_convert_encoding(fgets($fp), 'utf-8','shift-jis'); この場合、元のファイルがshift-jisであればなんら問題は無いのですが、すべてのファイルがそうとは限りません。なので、アップロードしたファイルの文字コードを調べ、その文字コードを記述するようにしたいのですが、調べる方法は何か無いでしょうか? ※[auto]を試してみましたが、その際は文字化けが起きていましましたので、出来れば他の方法でお願いします。 自分なりに調べてみましたが、良い情報を見つけることが出来なかったので、ご存知の方は宜しくお願い致します。

    • ベストアンサー
    • PHP
  • Python os.system 日本語ファイル名 文字化け

    python2.6 ubuntu 9.04 x64 ファイル文字コード UTF-8 # -*- coding: UTF-8 -*- import os, sys command = 'echo "あいうえお" > あああ.txt' os.system (command) このようにファイル出力すると、_____.txt と出力されます。 どのように解決するのでしょうか 直接 echo "あいうえお" > あああ.txt' とコマンドを打った場合は日本語ファイルが作成されます。 print sys.getfilesystemencoding() print sys.stdin.encoding print sys.stdout.encoding print sys.stderr.encoding print sys.getdefaultencoding() >UTF-8 >UTF-8 >UTF-8 >UTF-8 >ascii

  • phpでファイルが削除できない

    こんにちは。 ファイル名の書かれたdir.txtを開いて、その中から1日以上経過したファイルを削除するtime.phpを作成しようと思っています。 実行してみると、24時間経過したファイルがあっても 「Warning: unlink() [function.unlink]: Permission denied in C:\Program Files\xampp\htdocs\test\time.php on line 33」 というエラーがでて削除できない 実行結果にprintするように指定していない$imaの数値「1128673152」が表示される。 のですが、どこに間違いがあるのでしょうか? time.phpの内容 ---------------------------------------------------------------------- <html> <body> <?php // ファイルを読み込み専用でオープンする $fp = fopen('dir.txt', 'r'); // 終端に達するまでループ while (!feof($fp)) { // ファイルから一行読み込む $line = fgets($fp); $line = rtrim($line); // ファイルの更新時間を調べる $kousin = filemtime("$line"); // 今の時刻 $ima = time(); // 経過時間を計算する $keika = $ima - $kousin; // 出力する print $line; print "<br>\n"; print $ima; print "<br>\n"; print $kousin; print "<br>\n"; print $keika; print "<br>\n"; clearstatcache(); if ( $keika > 86400 ) { unlink( "$file" ); } } // ファイルをクローズする fclose($fp); ?> </body> </html> ----------------------------------------------------------------------

    • ベストアンサー
    • PHP
  • 特定ファイルのみ文字コード変換

    現在PHP5を文字コードUTF-8で使っているのですが あるphpファイルのみSJISで出力したくて色々調べphp.iniを設定したのですが、どんなに強引(無謀)な方法を使ってもブラウザで表示すると文字コードがUTF-8で認識されてしまいます。 (mbstring.detect_order default_charset mbstring.http_output などを色々変更して試しました。) <meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS" />も記述しています。 SJISで出力させたいファイルの保存文字コードはSJISです。 .htaccess でのフォルダ単位の指定も試したのですがダメでした。 phpファイル内に下記を記述してもダメでした。 header('content-type:text/html; charset=Shift_JIS'); 試しに $test $test2 = mb_convert_encoding($test ,'Shift_JIS' ,'UTF-8'); なども試してみたのですが、何をやってもブラウザはUTF-8と認識してしまうため文字化けしてしまいます。 apacheの設定で AddDefaultCharset は設定していません。 php.iniの設定は素人なりにですがやりつくしたと思うのですが・・・httpd.conf なのかと思って調べても見たのですがUTF-8の記述すらありませんでした。 ちなみに普通のhtmファイルの場合はmetaタグの文字コードをSJIS指定しただけで正しくSJISで表示されます。 ・・・というような状態なのですが、ブラウザにUTF-8と強制的に認識させてしまう設定はどこでされてしまっているのでしょうか? ・・・やはりphp.iniなのでしょうか? 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 日本語が文字化けしないよう読み込み

    特定ファイルにある複数行の日本語文章を 「fgets」や「file_get_contents」などで画面に読み込む時は、 単純に「mb_convert_encoding」を使えば 良いと思ったのですが 下記のようには文法的にも使えませんでした。 -------------------------------------- <?php $fp = fopen("sample.txt", "r"); $fp = mb_convert_encoding($fp, "UTF-8"); ←※間違い if($fp){ flock($fp, LOCK_SH); while(!feof($fp)){ $data = fgets($fp); echo "$data<br>"; } flock($fp, LOCK_UN); } fclose($fp); ?> -------------------------------------- すでに書き込んである 日本語が複数行書かれたファイルから 文字化けしないようにデータを読み込んで表示するには どのような処理をしたら良いのでしょうか? 複雑な処理はまだ理解できないので 簡単な処理方法があれば お教えください。 よろしくお願いいたいます。

    • ベストアンサー
    • PHP
  • CSVファイル読み込み 文字化け

    アドバイスの方頂ければと思い質問しました。 os fedoracore5/php 5.2.5/mysql 5.0.27 SJISのCSVファイルを読み,UTF-8のプログラムで処理したいのですが、 文字列中に[,]を使用しているものには[""]で囲って いて、その他文字列の日本語部分は[""]で囲まれていません。 そこで下記のような形にしたのですが、日本語が化けてしまいます。 またCSVファイルの文字化けする項目を[""]で囲むと 正常に表示されます。文字列を[""]で囲まずとも文字化けしない方法、またプログラムに問題があればアドバイスを 頂ければと思います。 <?php define("TEST_FILE", "./tes.csv"); header("Content-Type: text/plain; charset=SJIS"); $fp = fopen(TEST_FILE, "r") ; while ($row = fgetcsv($fp)) { for ($j = 0; $j < count($row); $j++) { $data = mb_convert_encoding($row[$j], "UTF-8", "SJIS"); printf($data); } } fclose($fp); ?>

    • ベストアンサー
    • PHP

専門家に質問してみよう