成瀬です 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