チケット #1503 が更新されました。 (by Takashi Tamura)


こんにちは、sheepman です。

> 一方、/[#{s}]/nは
> /<NUL>-<US><DEL>-<\xFF>/nとソースコードにそのままリテラルで書くのと、
> 基本的には同じなので、当然invalid multibyte char扱いでエラーになります。

エンコーディングが適切に設定されていれば、たとえスクリプトエンコーディングと
異なっていても問題ないみたいです。この例の場合、s のエンコーディングが
ASCII-8BIT なら ok のようです。

 $ cat e02.rb
 # coding: euc-jp 
 s = "\x00-\x1f\x7f-\xff".force_encoding("ASCII-8BIT")
 p /[#{s}]/.encoding
 p /[#{s}]/n.encoding

 $ ruby-1.9 -v
 ruby 1.9.2dev (2009-08-01 trunk 24343) [i686-linux]

 $ ruby-1.9 e02.rb
 #<Encoding:ASCII-8BIT>
 #<Encoding:ASCII-8BIT>

ここからが質問です。

/#{s}/n は /#{s.dup.force_encoding("ASCII-8BIT")}/ と同じ動作をするように
しても良いように思えるのですが、そうしない理由はなんでしょうか?
つまり「Regexp.new(s, nil, "n") は Regexp.new(s.dup.force_encoding("ASCII-8BIT"))と同じだけど、
/#{s}/n は /#{s.dup.force_encoding("ASCII-8BIT")}/ と同じではない」理由が知りたいです。

 
----------------------------------------
http://redmine.ruby-lang.org/issues/show/1503

----------------------------------------
http://redmine.ruby-lang.org