- blogs:
- cles::blog
« Bonanzaがオープンソースに :: 「Google Sync」を試す »
2009/02/21

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

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 を使ってログインすることができます。
« Bonanzaがオープンソースに :: 「Google Sync」を試す »
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . Windows 10 で勝手にログアウトされないようにする(3711)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(3177)
3 . RDP のプロトコルを TCP だけに変更する(2432)
4 . 「日次」は「にちじ」じゃない?(2264)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(2186)
2 . リモートデスクトップで Alt + PrtSc と同じことをするには(3177)
3 . RDP のプロトコルを TCP だけに変更する(2432)
4 . 「日次」は「にちじ」じゃない?(2264)
5 . リモートデスクトップで Ctrl + Alt + Del キーを送信するには(2186)
cles::blogについて
Referrers