Bug #981
String#encode() keeps invalid bytes when converting to US-ASCII
| Status: | Closed | Start date: | 01/05/2009 | |
|---|---|---|---|---|
| Priority: | Normal | Due date: | ||
| Assignee: | % Done: | 100% |
||
| Category: | M17N | |||
| Target version: | 1.9.1 RC2 | |||
| ruby -v: |
Description
String#encode() (変換の指定なし、default_internal に変換) は default_internal が US-ASCII の場合だけ invalid なバイトや unknown な文字をそのままコピーします。他のエンコーディング では '?' などにレプレースされます。 実行例: > ruby -E:ascii-8bit -e'puts "\uabcd'.encode.inspect' "?" > ruby -E:euc-jp -e'puts "\uabcd'.encode.inspect' "?" > ruby -E:us-ascii -e'puts "\uabcd'.encode.inspect' "\xEA\xAF\x8D" 意図的なものであるとはどうしても思いませんが、もしそう でしたら rdoc で書いた方がいいかと思います。 ([ruby-dev:37662] 参照) よろしくお願いします。 Martin.
Associated revisions
* encoding.c (enc_set_default_encoding): should not treat US-ASCII
special here. a patch from Yui NARUSE in [ruby-dev:37769].
[ruby-dev:37699]
History
Updated by Yuki Sonoda about 3 years ago
- Category set to M17N
- Target version set to 1.9.1 RC2
Updated by Yui NARUSE about 3 years ago
- Assignee changed from Akira Tanaka to Yukihiro Matsumoto
この挙動は String#encode が直接の原因ではなく、Encoding.default_internal 側が原因です。
% ruby19 -E:us-ascii -e'p Encoding.default_internal'
#<Encoding:UTF-8>
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");
}
/*
Updated by Yukihiro Matsumoto about 3 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
Applied in changeset r21528.