[#46033] cgi をするときのデバック方法について — Nobuyuki Inaba <nobuyuki.inaba@...>

稲葉と申します。

15 messages 2009/05/22
[#46034] Re: cgi をするときのデバック方法について — rubikitch@... 2009/05/23

From: Nobuyuki Inaba <nobuyuki.inaba@gmail.com>

[ruby-list:45989] Re: 質問:IO#set_encoding 後の IO#gets について

From: "NARUSE, Yui" <naruse@...>
Date: 2009-05-02 21:02:48 UTC
List: ruby-list #45989
成瀬です。

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>

In This Thread