BLOGTIMES
2009/02/21

Win32のRubyで改行がCR+LFになってしまう

  ruby 
このエントリーをはてなブックマークに追加

LinuxやCygwinでは問題ないものの、Win32版のRubyでファイルの書き出しを行うと、改行コードがCR+LFになってしまうという問題でちょっとはまってしまったので忘れないようにメモ。
結論としては、ファイルをテキストモードとして開いていたのが原因でした。

たとえば、下記のようなコードを実行するとLinuxでは改行がLF(\n)になるのに対して、Win32ではCR+LF(\r\n)になります。

#!/bin/ruby open("foo.txt", "w") {|f| f.write("bar\nbuzz") }

Win32の実行結果をodした結果

$ od -c foo.txt 0000000 b a r \r \n b u z z 0000011

Linuxの実行結果をodした結果

$ od -c foo.txt 0000000 b a r \n b u z z 0000010

そういえばずっと昔、Perlでもはまったような気がする・・・・

どう考えてもファイルの書き込み時に\n → \r\nの変換が自動的に行われているようにしか見えないことと、WindowsとLinuxのプラットフォーム的な違いによって発生している(としか思えない)ことから、よくよく考えてみるとWindowsにはファイルにテキストモードとバイナリモードがあることを思い出しました。大昔、Windows上でPerlを動かしたときにもはまった記憶がありますが、すっかり忘れてしまっていました。

ということで、プログラムを以下のように書き換えると無事Win32でも改行がLFのファイルを書き出すことができました。

#!/bin/ruby open("foo.txt", "wb") {|f| f.write("bar\nbuzz") }

Rubyのリファレンスではこれくらいしか触れられていないので、もうちょっと解説しておいてくれるといいんですけどね。

組み込み関数 - Rubyリファレンスマニュアル

これらのいずれに対しても "b" フラグを("r+b"のように)つけることができます(整数なら File::BINARY)。この場合、バイナリモードでオープンします(ただし、システムがテキスト/バイナリでファイルを区別する場合に限ります)

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/2935
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン