From: Yui NARUSE Date: 2009-01-15T14:15:03+09:00 Subject: [ruby-dev:37769] [Bug #981] String#encode() keeps invalid bytes when converting to US-ASCII チケット #981 が更新されました。 (by Yui NARUSE) 担当者 Akira TanakaからYukihiro Matsumotoに変更 この挙動は String#encode が直接の原因ではなく、Encoding.default_internal 側が原因です。 % ruby19 -E:us-ascii -e'p Encoding.default_internal' # enc_set_default_encoding を見ると、 if (def->index == ENCINDEX_US_ASCII) def->index = defindex; と、US-ASCII の場合にデフォルトのエンコーディング (default_internal では UTF-8) がセットされています。 現在の仕様ではこの辺の処理は不要な気がするので、以下の通りとか。 Index: encoding.c =================================================================== --- encoding.c (revision 21519) +++ encoding.c (working copy) @@ -1051,7 +1051,7 @@ struct default_encoding { static int enc_set_default_encoding(struct default_encoding *def, VALUE encoding, - const char *name, int defindex) + const char *name) { int overridden = Qfalse; if (def->index != -2) @@ -1066,8 +1066,6 @@ enc_set_default_encoding(struct default_encoding * } else { def->index = rb_enc_to_index(rb_to_encoding(encoding)); - if (def->index == ENCINDEX_US_ASCII) - def->index = defindex; def->enc = 0; enc_alias_internal(name, def->index); } @@ -1118,7 +1116,7 @@ rb_enc_set_default_external(VALUE encoding) rb_raise(rb_eArgError, "default external can not be nil"); } enc_set_default_encoding(&default_external, encoding, - "external", ENCINDEX_US_ASCII); + "external"); } /* @@ -1171,7 +1169,7 @@ void rb_enc_set_default_internal(VALUE encoding) { enc_set_default_encoding(&default_internal, encoding, - "internal", ENCINDEX_UTF_8); + "internal"); } /* ---------------------------------------- http://redmine.ruby-lang.org/issues/show/981 ---------------------------------------- http://redmine.ruby-lang.org