電子書籍の厳選無料作品が豊富!

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");でもよいということですよね?

A 回答 (1件)

fgets/fwriteなどの全てのストリームの読み書き操作に、こんな関数が適用されると思ってください。

str_replace関数だと複数置換時にすでに置換した部分の上書きが起こるので、長さ順にソートして上書き置換を起こさないように自動でうまく調整してくれるstrtr関数を内部的に用います。

/* 改行コードを全てPHP_EOLで使われているものに統一する関数 */
function filter($str) {
return strtr($str, array_fill_keys(array("\r\n", "\r", "\n"), PHP_EOL));
}

まぁ私は互換性の面から、テキストファイルであってもバイナリファイルであっても全て「b」を使うようにしてますが…Windowsであってもメモ帳以外のエディタであればCRLFでなくてLF単独で正しく扱えますし…

備考↓

[PHP] ファイルオープンモードに関するマニュアルの記述は間違っている
http://qiita.com/mpyw/items/3adcec3c66e515895b08
    • good
    • 0
この回答へのお礼

>Windowsであってもメモ帳以外のエディタであればCRLFでなくてLF単独で正しく扱えますし…

ですよねー。

お礼日時:2014/01/26 12:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!