Feature #2835: String#encodeに置換文字列のみを与えたら未定義向けとみなす
http://redmine.ruby-lang.org/issues/show/2835

起票者: Yui NARUSE
ステータス: Open, 優先度: Normal
カテゴリ: M17N

Ruby 1.9 もおおむね完成してからそろそろ 3 年が経つのですが、
気付いた事として、String#encode(to, from, opt) の opt に :replace を指定した時は、
ほとんどの場合 :undef => :replace も指定するという事があります。

よくよく考えれば、不正なバイト列を続行したいという事は少ないし、推奨されず、
ゆえに置換文字列を指定する場合はたいてい未定義文字を置き換えたい場合な訳です。

以下のパッチは、:invalid => :replace がしているされている場合以外に、
(つまり、不正なバイト列向けに置換文字列が指定されている可能性がある場合以外)
置換文字列を指定している場合、:undef => :replace とみなします。

想定ケースでは :undef => :replace と書かなくてすむので楽な上に、
楽な方法に誘導する事で、よく考えずに {:invalid => :replace, :undef => :replace}
と書いてしまう人を減らせるので一石二鳥だと思うのですが、いかがでしょう。

diff --git a/transcode.c b/transcode.c
index d511547..9d6a886 100644
--- a/transcode.c
+++ b/transcode.c
@@ -2394,6 +2394,11 @@ econv_opts(VALUE opt)
         rb_raise(rb_eArgError, "unknown value for undefined character option");
     }

+    v = rb_hash_aref(opt, sym_replace);
+    if (!NIL_P(v) && !(ecflags & ECONV_INVALID_REPLACE)) {
+        ecflags |= ECONV_UNDEF_REPLACE;
+    }
+
     v = rb_hash_aref(opt, sym_xml);
     if (!NIL_P(v)) {
         if (v==sym_text) {


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