Project

General

Profile

Actions

Feature #2835

closed

String#encodeに置換文字列のみを与えたら未定義向けとみなす

Added by naruse (Yui NARUSE) about 14 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-dev:40554]

Description

=begin
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) {
    =end
Actions

Also available in: Atom PDF

Like0
Like0Like0