2008年7月21日月曜日

PHPで fgets()する時の改行コード

Macの場合、php.iniで「auto_detect_line_endings = on」を指定すれば、改行コードを意識しなくて良いらしい。
auto_detect_line_endingsはデフォルトではコメントアウトされている。

注意: マッキントッシュコンピュータ上で作成されたファイルを読み込む際に、 PHP が行末を認識できないという問題が発生した場合、 実行時の設定オプションauto_detect_line_endings を有効にする必要が生じるかもしれません。

php.iniにはこう書かれている。
; If your scripts have to deal with files from Macintosh systems,
; or you are running on a Mac and need to deal with files from
; unix or win32 systems, setting this flag will cause PHP to
; automatically detect the EOL character in those files so that
; fgets() and file() will work regardless of the source of the file.
(ここでいう「Mac」とは、OS Xになる前のバージョン9までの古いMacを指すと思われる。参考:改行コード - Wikipedia


これは逆に言うと、Macが関わらないLinux・Windowsだけの環境なら、auto_detect_line_endingsの設定も含めてfgets()での改行コードについて特に意識しなくてよいということだ。

試しにWindows上のPHPで改行コードが「CR+LF」の場合と「LF」の場合でfgets()結果に違いがあるか実験してみたところ、違いは無かった。
(auto_detect_line_endingsはコメントアウトのまま。)
しかし、改行コードが「CR」の場合、全て1行目として扱われてしまった...。

テストに使ったコードは下記の通り。
<?php
$fp = @fopen('test.php', 'r');
$i = 1;
if ($fp) {
 while (!feof($fp)) {
  echo "$i : " . fgets($fp);
  $i++;
 }
 fclose($fp);
}


あと、fgets()で取得した文字列の最後には改行コードが付いているので注意。不要な場合はrtrim()で取り除ける。

3 件のコメント:

匿名 さんのコメント...

勉強になりました。ありがとうございました。

floatingdays さんのコメント...

お役に立てて良かったです ^^

匿名 さんのコメント...

助かりました。どもです^^

ブログ アーカイブ

tags