成瀬です

NARUSE, Yui wrote:
> 一つの方法として、現在の Encoding.default_external 以外に、そのアプリ
> ケーションの主たる内部エンコーディングを明示する方法を用意する――例えば
> Encoding.primary_encoding を作ればいいかなぁと思っているのですが影響範囲
> をまだ考えきれていません。

とりあえず default_internal というものを作ってみました。

例えば、inspect の例ですと、
irb(main):006:0>  ["\x82\xa0".force_encoding("sjis"),
irb(main):007:1*    "\xa4\xa2".force_encoding("euc-jp"),
irb(main):008:1*    "\xe3\x81\x82".force_encoding("utf-8")]
=> ["\x82\xA0", "\xA4\xA2", "あ"]
こんな感じになります。

=== encoding.c
==================================================================
--- encoding.c  (revision 15414)
+++ encoding.c  (local)
@@ -1030,6 +1030,40 @@
     return rb_enc_from_index(idx);
 }

+static int default_internal_index;
+
+rb_default_internal_encoding(void)
+    return rb_enc_from_index(default_internal_index);
+
+VALUE
+rb_enc_default_internal(void)
+{
+    return rb_enc_from_encoding(rb_default_internal_encoding());
+}
+
+/*
+ * call-seq:
+ *   Encoding.default_internal => enc
+ *
+ * Returns default internal encoding.
+ *
+ * It is initialized by the encoding of main script.
+ */
+static VALUE
+get_default_internal(VALUE klass)
+{
+    return rb_enc_default_internal();
+}
+
+void
+rb_enc_set_default_internal(VALUE encoding)
+{
+    default_internal_index = rb_enc_to_index(rb_to_encoding(encoding));
+}
+
 static int default_external_index;

 rb_encoding *
@@ -1246,6 +1280,7 @@
     rb_define_method(rb_cEncoding, "_dump", enc_dump, -1);
     rb_define_singleton_method(rb_cEncoding, "_load", enc_load, 1);

+    rb_define_singleton_method(rb_cEncoding, "default_internal",
get_default_in
ternal, 0);
     rb_define_singleton_method(rb_cEncoding, "default_external",
get_default_ex
ternal, 0);
     rb_define_singleton_method(rb_cEncoding, "locale_charmap",
rb_locale_charma
p, 0);

=== string.c
==================================================================
--- string.c    (revision 15414)
+++ string.c    (local)
@@ -3314,7 +3314,7 @@
 VALUE
 rb_str_inspect(VALUE str)
 {
-    rb_encoding *enc = STR_ENC_GET(str);
+    rb_encoding *enc = rb_default_internal_encoding();
     char *p, *pend;
     VALUE result = rb_str_buf_new2("");

=== ruby.c
==================================================================
--- ruby.c      (revision 15414)
+++ ruby.c      (local)
@@ -1021,6 +1021,7 @@
        rb_enc_associate(opt->e_script, eenc);
        require_libraries();
        tree = rb_parser_compile_string(parser, opt->script,
opt->e_script, 1);
+       rb_enc_set_default_internal(rb_parser_encoding(parser));
     }
     else {
        if (opt->script[0] == '-' && !opt->script[1]) {
@@ -1200,6 +1201,9 @@
     else if (f != rb_stdin) {
        rb_io_close(f);
     }
+    rb_enc_set_default_internal(rb_parser_encoding(parser));
+    if (rb_default_internal_encoding() == rb_usascii_encoding())
+
rb_enc_set_default_internal(rb_enc_from_encoding(rb_locale_encoding()));
     return tree;
 }

=== include/ruby/encoding.h
==================================================================
--- include/ruby/encoding.h     (revision 15414)
+++ include/ruby/encoding.h     (local)
@@ -164,9 +164,12 @@
 rb_encoding *rb_utf8_encoding(void);
 rb_encoding *rb_usascii_encoding(void);
 rb_encoding *rb_locale_encoding(void);
+rb_encoding *rb_default_internal_encoding(void);
 rb_encoding *rb_default_external_encoding(void);
 int rb_usascii_encindex(void);
+VALUE rb_enc_default_internal(void);
 VALUE rb_enc_default_external(void);
+void rb_enc_set_default_internal(VALUE encoding);
 void rb_enc_set_default_external(VALUE encoding);
 VALUE rb_locale_charmap(VALUE klass);


-- 
NARUSE, Yui  <naruse / airemix.com>
DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA