Perl/CGIでデータの改行コードが0x0D0x0D0x0A(\r\r\n)になった場合の原因と対策
Windows Vistaのテストサーバで最近、Perl/CGIのテストをいろいろやっています。そんな中、テキストファイルにデータを書き出すという単純なプログラムで、改行コードが変てこになる現象に遭遇。ここ数年、PHPばっかりやっていたためにPerlのお作法をすっかり忘れてしまっているみたいです。
秀丸でファイルを開いてみると、改行が増えています!! 1回しか改行していないところは2行になっていますし、1行空白行を作っている場合は、3行空いています。何だこれは? バイナリーエディタで見てみると、改行の部分が「0x0D0x0D0x0A(\r\r\n)」(0x0d0d0a)になっています。調べてみたら、すぐに原因が見つかりました。
● とほほのperl入門(概要編)
http://www.tohoho-web.com/wwwperl1.htm
このサイトのおかげで一発で解決できました。PHPではこのような現象は起きたことがなかったので気づきませんでした。また、Perl/CGIをメインに使っていた数年前は、Windowsにテストサーバを準備してという技量もなかったので、直接、Unix系サーバにアップロードしてテストしていた(今考えると恐ろしい。)ので、こういう問題に気づきませんでした。まさしく、「とほほ」な感じです。
Perlって使いにくいなと思いましたが、PHPでも、4.3.2以前の出力モードは環境依存だったようです。
● 開発規約/95 - BugbearR's Wiki「テキストモードとバイナリモードの区別を明確にする。(改行コードの取り扱い) 」
http://www.bugbearr.jp/?%E9%96%8B%E7%99%BA%E8%A6%8F%E7%B4%84%2F95
調べてみると、PHPのマニュアル「fopenの項」にも、そのいきさつが明記されていますね。まだまだ勉強しなければならないことが多そうです。とほほ。
秀丸でファイルを開いてみると、改行が増えています!! 1回しか改行していないところは2行になっていますし、1行空白行を作っている場合は、3行空いています。何だこれは? バイナリーエディタで見てみると、改行の部分が「0x0D0x0D0x0A(\r\r\n)」(0x0d0d0a)になっています。調べてみたら、すぐに原因が見つかりました。
● とほほのperl入門(概要編)
http://www.tohoho-web.com/wwwperl1.htm
Windows上で上記のスクリプトを実行した場合、STDOUT や OUT への出力は \n が \r\n に自動変換されて書き込まれます。これをテキストモードと呼びます。この自動変換を行わないようにしたい時は binmode()を用いてバイナリモードにしてください。
このサイトのおかげで一発で解決できました。PHPではこのような現象は起きたことがなかったので気づきませんでした。また、Perl/CGIをメインに使っていた数年前は、Windowsにテストサーバを準備してという技量もなかったので、直接、Unix系サーバにアップロードしてテストしていた(今考えると恐ろしい。)ので、こういう問題に気づきませんでした。まさしく、「とほほ」な感じです。
Perlって使いにくいなと思いましたが、PHPでも、4.3.2以前の出力モードは環境依存だったようです。
● 開発規約/95 - BugbearR's Wiki「テキストモードとバイナリモードの区別を明確にする。(改行コードの取り扱い) 」
http://www.bugbearr.jp/?%E9%96%8B%E7%99%BA%E8%A6%8F%E7%B4%84%2F95
調べてみると、PHPのマニュアル「fopenの項」にも、そのいきさつが明記されていますね。まだまだ勉強しなければならないことが多そうです。とほほ。
| 固定リンク
トラックバック
この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/67411/40027133
この記事へのトラックバック一覧です: Perl/CGIでデータの改行コードが0x0D0x0D0x0A(\r\r\n)になった場合の原因と対策:

コメント