• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PHPのfopen関数について質問です。)

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

このQ&Aのポイント
  • PHPのfopen関数について質問です。Windowsベースのシステムでは\r\nを使用し、マッキントッシュベースのシステムでは\rを使用します。間違った改行コードでファイルに書き込むと、他のアプリケーション上でそのファイルを開いた際に変な風に見えてしまいます。Windows上では、\nを\r\nに透過的に変換するtext-mode変換フラグ('t')が提供されます。それに対し、'b'を使って強制的にバイナリモードにすることもできます。その場合データの変換はされません。このフラグを使用するには、'b'または't'をmode引数の最後に追加してください。
  • PHPのfopen関数の第二引数のモードにはバイナリモードがあります。これは、Windows系プラットフォーム上で改行コードを\r\nに変換する処理を行わずにファイルに書き込むことができるモードです。通常、Windowsでは改行コードとして\r\nが使用されますが、他のシステムでは\nなどが使用される場合があります。バイナリモードでは、改行コードの自動変換を行わずに指定された改行コードのままファイルに書き込まれます。
  • 例えば、あるバイナリファイルに奇跡的に\nというバイトがなかった場合、fopen("test.jpg","rw");でも問題ありません。バイナリモードを指定しない場合、改行コードの変換が行われるため、何らかの影響が生じる可能性があります。バイナリモードを指定することで、改行コードの変換を回避することができます。

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

  • ベストアンサー
noname#244856
noname#244856
回答No.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

1000vicki
質問者

お礼

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

関連するQ&A