Windows環境におけるPHPのfopenのバイナリモードとテキストモードの違いとは?

このQ&Aのポイント
  • PHPのfopen時のバイナリモードについて質問です。Windows環境で画像ファイルをテキストモードで開いても読み込めるし、新規で書き込める場合、なぜ二つのモードが存在するのでしょうか?
  • バイナリモードとテキストモードの違いは改行文字だけではないですか?Linuxではバイナリもテキストも改行文字は¥nとなるのでしょうか?
  • PHPのマニュアルでは、バイナリモードが推奨されていますが、Windows環境でテキストモードで扱っても画像ファイルが正しく表示される場合もあります。
回答を見る
  • ベストアンサー

PHPのfopenのバイナリモードについて

PHPのfopen時のバイナリモードについて質問です。 PHPのマニュアルにはWINDOWSのようなバイナリとテキストモードの形式の違う システムでは、画像等のバイナリファイルを扱うときはbを付けてバイナリモードで扱うことが推奨されていますが、 WINDOWS環境でためしたところ、画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込んで、別名でfopen("~.jpg","w")で書き込んでも、きちんと表示される画像が作成されました。 テキストモードでバイナリファイルを開いても読み込めってさらに、新規でかきこめるなら なぜ二つのモードが存在するのでしょうか? ちなみに、WINDOWSにおけるバイナリとテキストモードの違いって改行文字が ¥nか¥r¥nの違いだけでしょうか? リナックスではバイナリもテキストも中身の改行文字は¥nとなるのでしょうか? よろしくお願いします。

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

Windows以外のOSでは、バイナリモードというのはなく、"wb" "rb" も "w" "r" も同じ動作です。Windowsとのソース互換性のため、"b" をつけてもエラーになりません。 Windowsのバイナリモードはそのままファイルを読み込む/書き込む。テキストモードは、"\r\n" を "\n" に変換しながら読み込み、"\n" を "\r\n" に変換しながら書き込む。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込ん その画像ファイルの中には\r\nというつながりのコードが存在するのでしょうか? マニュアルに書いてある通り 「互換性の意味から、常に適切なフラグを指定することが推奨」されているわけです

関連するQ&A

  • PHPのfopen関数について質問です。

    PHPマニュアル http://www.php.net/manual/ja/function.fopen.php 上記ページの >> Windows ベースのシステムでは \r\n を使用します。 マッキントッシュベースのシステムでは \r を使用します。 間違った改行コードでファイルに書き込むと、 他のアプリケーション上でそのファイルを開いた際に変な風に見えてしまいます。 Windows上では、\nを\r\nに透過的に変換する text-mode変換フラグ('t')が提供されます。 それに対し、'b'を使って強制的にバイナリモードにすることもできます。 その場合データの変換はされません。 このフラグを使用するには、'b' または 't'を mode引数の最後に追加してください。 とある様にPHPにおいてfopen関数の第二引数のモードに付加する場合のバイナリモードとは windows系プラットフォームにおいて書き込む文字列内に[¥n]というバイトがあった場合、プラットフォームにあわせて 自動的に書き出す際に¥r¥nに変換されるから・・・・。 という意味ですよね。 例えば、あるバイナリファイルに奇跡的に[¥n]というバイトがなかった場合、fopen("test.jpg","rw");でもよいということですよね?

    • ベストアンサー
    • PHP
  • バイナリモードとは?

    インフォシークでHPを作っていますが、 gooやYahooでは成功していた画像の表示ができません。 ヘルプを読んでみると、「ファイルがこわれていませんか?」 とか「ファイル名が違ってませんか?」とか 「バイナリモードで転送して下さい」とあるのですが、 とりあえず「バイナリモード」がわからないのです。 教えてgooで過去の質問を探ってみると、 「バイナリモードで転送しないとファイルがこわれる」などと あったのですが、それはどういうことでしょうか? ファイル名はJPGの部分を大文字でも小文字でも変更して試してみたのですがダメでした。 ので、ファイル名の方は関係ないとは思います・・・ ちなみに、他の無料HPスペース(イースター)でも同じように画像の表示ができません。 どうか教えていただきたいです。よろしくお願いします。

  • バイナリ

    VB6.0を使っています。 全てのファイル(Word、エクセル、Exe、Txtなどなんでも)はバイナリファイルとして扱えるのですか? バイナリファイルとして読み込んで、別名で保存して、 また、元の形式に戻すにはどのようにしたらよいのでしょうか? バイナリモードでOpenして 1バイトずつ、 バイナリモードで書き込めばいいのでしょうか? また、読む場合は、 バイナリモードで開いて、 1文字ずつ 何モードで書き込めばいいのでしょう? バイナリでいいのですか? ファイルの形式などよくわかっていません。。。。

  • バイナリモードについて

    はじめまして。 VBでテキストの検索機能をプログラミングする上で 大/小文字、カナ/ひらがな、全角/半角を区別して検索する ためにバイナリモード(vbBinaryCompare)を使用すると思うのですが このバイナリモードはFTPなどで耳にするバイナリモードとは 意味合いが違うのでしょうか? よろしくお願いします。

  • バイナリファイルに改行コードを追加したい

    C言語でマルチバイト文字(全角文字)を含めたバイナリファイル(改行のないテキストファイル)に指定したバイト長ごとに改行コードを追加するにはどのようにしたら良いのでしょうか?。 漠然とですがfopen()とfread()などを使うんだろうと おもうのですが、読み込んだ文字数の計算方法がわかりません。 どなたかご教授お願いします。

  • FTPのアスキーモードってバイナリーモードって?

    FTPにはアスキーモードとバイナリーモードとありますが、どちらを使用したらよいか分かりません。 例えばWINDOWSのnotepadで作成したsqlファイルをUNIXサーバへ転送する時はアスキーモードでしょうか? internetでダウンロードしたEXEファイルをWINDOWSからUNIXサーバへ転送する時はバイナリーモードでしょうか?教えて頂けないでしょうか?よろしくお願いいたします。

  • バイナリファイルの検索について

    いつもお世話になります。 今、検索について学習しているのですが、 文字列検索の場合はstrstrなどを使用すれば 検索できることは理解できました。 しかし、バイナリファイルの検索について理解できていません。 もし、バイナリ(画像や動画etc)ファイルの 中身を解析したい場合、 (1)JPEGなどのバイナリファイルを開く場合、fopen()でひらいてもいいのでしょうか?その他の方法ありますか? (2)バイナリファイルを開いた後、バイナリファイルの 0xfffeなど指定する値の検索がしたい場合は どのように検索したらいいのでしょうか? 関数や方法などありましたら教えてください。 どうぞよろしくお願い致します。

  • fopenのモードによりfgetsするレングスが異なるのは何故ですか?

    ファイルを読み、そのレングスをチェックしています。 $file = @fopen($_FILES['fl']['tmp_name'],"r"); if ($file) {  while (!feof($file)) {   $rec = fgets($file);   print("レングス".strlen($rec)."<br>");   (後略) 例えば1500バイトの固定長ファイルを読んだ場合、 fopenモード"r"だと以下の通りです。  レングス1502(改行が含まれるので1500+2?)  レングス1502 これをモード"r+"にすると以下のようになります。    レングス1502  レングス1499 両者の差はどこから来ているのでしょうか? ご教示いただけると幸いです。

    • 締切済み
    • PHP
  • windows環境でphpのfopenが使用できない

    rimyと申します。 windowsでapacheを使用していて、PHP5をインストールしています。 PHPは作動していて、スプリクトは実行できます。 しかしfopen関数を使ってファイルをロードしようとしたところ なぜかエラーが起きます。 fopen関数は fopen('ファイルパス','モード'); でやれるので やってみましたが、 Warning: fpassthru(): supplied argument is not a valid stream resource in C:\Apache\htdocs\test\reading.php on line 6 という表示が出ます。 ちなみにスプリクトは <html> <head><title>ファイルの読み出し</title></head> <body> <?php $text = fopen("test.txt","b""r"); fpassthru($text); ?> </body> </html> と書いてあります。 あるサイトで windows環境では モードにbを入れろ と書いてありましたがどういうことでしょうか。 まだ最近 勉強し初めでわかりませんのでよろしくお願いします。

    • ベストアンサー
    • PHP
  • バイナリコードを見つけ出すツールを教えてください

    私のパソコン内にテキストコードのみで構成される拡張子がtxtやhtmlのファイルが大量にあります。 パソコンがウイルスに感染すると、パソコン内のファイルがいつの間にか変更されていることがありますが、変更されているかどうかを調べるためにバイナリコードを見つけ出すツールを探しています。 テキストコードのみで構成されていたファイルの中身が変更されていたなら、バイナリコードが付加されているはずなので、バイナリコードを見つけ出すことが出来れば、そのファイルの中身が変更されていることが分かるという判断です。 notepadでバイナリファイルを開くと、黒い四角や難しい漢字、半角のカタカナなどが表示されるので、とりあえず その黒い四角 をコピーして 試しに GrepReplaceで、検索文字列の欄に 黒い四角 をペーストして、あるファイル(テキストコードのみのファイルにバイナリファイルを結合させたファイル)の中身を検索しましたが、 黒い四角があるはずなのに、GrepReplaceでは残念ながらヒットしませんでした。 バイナリコードである 黒い四角 を検索文字列にして検索をすると、的確にヒットするツールがあれば教えてください。 またバイナリコードが含まれているかどうかについて、数多くのファイルを一括して調べることが出来るツールがあれば教えてください。

専門家に質問してみよう