成瀬です。

Dice wrote:
> 環境は ruby 1.9.1 (2009-01-30 revision 21907) [i386-mswin32] です。
> --------
> <ascii mode>
> "line 1\n"
> "line 2\n"
> nil
> "line 1\n"
> "\n"
> "line 2\n"
> --------
> 
> ここで ascii mode の出力5行目は、なぜ "line 2\n" ではなく "\n" なのでしょうか?

* Windows環境では、改行はCRLFである
* Ruby 1.9.1のASCII MODEではuniversal newlineがデフォルトでON
なのが原因です。

universal newlineの解説がそもそもないのがバグっぽい。
要は\rも\r\nも読み込んだ時点で\nにしちゃうってやつです。
http://www.garbagecollect.jp/~usa/d/200808c.html#id20080825_P1
るりまには書いておくようにします。

このtest.txtは"line 1\r\nline 2\r\n"という内容です。
universal newlineがONの場合、最初のinput.getsの後、
カーソルは\rの直後に来ます。
このときに、Rubyは状態として「CRの直後である」と覚えておきます。
で、通常は次のgetsの時に、\nが最初に来た場合、これを捨てます。

で、このときにset_encodingを読んだ場合です。
set_encodingはエンコーディング変換周りの状態を全てリセットします。
よって、\nを捨てずにそのまま出力してしまうわけです。

結局の所、この挙動については、読み込み中のset_encodingは動作を保証しない
ということになります。

-- 
NARUSE, Yui  <naruse / airemix.jp>