Project

General

Profile

Actions

Bug #981

closed

String#encode() keeps invalid bytes when converting to US-ASCII

Added by duerst (Martin Dürst) almost 14 years ago. Updated over 11 years ago.

Status:
Closed
Priority:
Normal
Target version:
ruby -v:
Backport:
[ruby-dev:37699]

Description

=begin
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.
=end

Actions #1

Updated by yugui (Yuki Sonoda) almost 14 years ago

  • Category set to M17N
  • Target version set to 1.9.1 RC2

=begin

=end

Actions #2

Updated by naruse (Yui NARUSE) almost 14 years ago

  • Assignee changed from akr (Akira Tanaka) to matz (Yukihiro Matsumoto)

=begin
この挙動は 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");
    

}

/*

=end

Actions #3

Updated by matz (Yukihiro Matsumoto) almost 14 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
Applied in changeset r21528.
=end

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0