From: Hidetoshi NAGAI Date: 2008-01-21T02:13:54+09:00 Subject: [ruby-dev:33223] Re: Binary String 永井@知能.九工大です. 先のメールに少し補足します. From: Hidetoshi NAGAI Subject: [ruby-dev:33202] Re: Binary String Date: Sun, 20 Jan 2008 06:58:41 +0900 Message-ID: <20080120.065836.74742027.nagai@ai.kyutech.ac.jp> > 永井@知能.九工大です. > > From: Yukihiro Matsumoto > Subject: [ruby-dev:33193] Re: Binary String > Date: Sun, 20 Jan 2008 02:28:17 +0900 > Message-ID: > > 「一番すっきり」という基準がよくわからないのですが、私の主観 > > ではわからないものは全部「ASCII-8BIT」というのが一番すっきり > > しています。 > > わからないものとわかる or わかるとしていいものとの両方に > ASCII-8BIT が付くことがあるように見受けられるので... > > 「何でこれが ASCII-8BIT になっちゃうの!」というケースが > 一切無くなるのであれば,ASCII-8BIT でもいいんですが. 簡単に言ってしまうと, 「わからないものについては『わからない』って正直に言っちゃおうよ」 って話です. そうすれば「あれにすべき」だとか「勝手に与えるべきではない」だとかで ゴタゴタしないでしょうし,未定義を扱いたい人もそうでない人も どちらも納得できるようにできるかもと思ってます. > > なんだかえらく複雑ですが、default_undefinedをプログラム中から > > 変更できるならそれは一種の大域変数なので面倒な「状態」を導入 > > することになります。スレッドセーフじゃなくなるし。それはあま > > 実装の問題はよく分かっていないのですが.そうなんですか? こんな感じのことを考えてたんですが... ------------------------------------------------------------ $ irb19 irb(main):001:0> s = '感じ' => "感じ" irb(main):002:0> s.encoding => # irb(main):003:0> s2 = s.dup => "感じ" irb(main):004:0> s2.force_encoding('UNDEFINED-8BIT') => "\xB4\xB6\xA4\xB8" irb(main):005:0> Encoding.default_undefined => # irb(main):006:0> Encoding.default_undefined = 'EUC-JP' => "EUC-JP" irb(main):007:0> Encoding.default_undefined => # irb(main):008:0> s2 => "感じ" irb(main):009:0> s2.encoding => # irb(main):010:0> Encoding.default_undefined = 'ASCII-8BIT' => "ASCII-8BIT" irb(main):011:0> s2 => "\xB4\xB6\xA4\xB8" irb(main):012:0> s2.encoding => # irb(main):013:0> ------------------------------------------------------------ ここでは UNDEFINED-8BIT への force_encoding を許してますが, これは禁止してもいいのかなと思ってます. 上記動作のためのパッチは以下の通りです. 無茶なことをやってますかね?(^_^; ついでに ENC_ALIAS("BINARY", "ASCII-8BIT") ではなく ENC_REPLICATE("BINARY", "ASCII-8BIT") なら十分満足なんですが... Index: encoding.c =================================================================== --- encoding.c (revision 15145) +++ encoding.c (working copy) @@ -313,6 +313,43 @@ return enc_replicate(idx, name, rb_enc_from_index(origidx)); } +static char* UNDEFINED_ENC = "UNDEFINED-8BIT"; + +static VALUE +get_default_undefined(VALUE self) +{ + int idx; + + idx = rb_enc_find_index(UNDEFINED_ENC); + if (idx < 0) { + rb_raise(rb_eArgError, "can't find encoding name - %s", UNDEFINED_ENC); + } + return enc_base_encoding(rb_enc_from_encoding(enc_table.list[idx].enc)); +} + +static VALUE +set_default_undefined(VALUE klass, VALUE enc) +{ + int idx; + rb_encoding *encoding; + + if (SYMBOL_P(enc)) enc = rb_id2str(SYM2ID(enc)); + idx = rb_enc_find_index(StringValueCStr(enc)); + if (idx < 0) { + rb_raise(rb_eArgError, "unknown encoding name - %s", RSTRING_PTR(enc)); + } + encoding = rb_enc_from_index(idx); + + idx = rb_enc_find_index(UNDEFINED_ENC); + if (idx < 0) { + rb_raise(rb_eArgError, "can't find encoding name - %s", UNDEFINED_ENC); + } + enc_register_at(idx, UNDEFINED_ENC, encoding); + set_base_encoding(idx, encoding); + + return rb_enc_from_encoding(encoding); +} + int rb_define_dummy_encoding(const char *name) { @@ -1209,6 +1246,9 @@ 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_undefined", get_default_undefined, 0); + rb_define_singleton_method(rb_cEncoding, "default_undefined=", set_default_undefined, 1); + rb_define_singleton_method(rb_cEncoding, "default_external", get_default_external, 0); rb_define_singleton_method(rb_cEncoding, "locale_charmap", rb_locale_charmap, 0); Index: enc/ascii.c =================================================================== --- enc/ascii.c (revision 15145) +++ enc/ascii.c (working copy) @@ -48,6 +48,7 @@ onigenc_always_true_is_allowed_reverse_match }; ENC_ALIAS("BINARY", "ASCII-8BIT"); +ENC_REPLICATE("UNDEFINED-8BIT", "ASCII-8BIT"); ENC_REPLICATE("IBM437", "ASCII-8BIT"); ENC_ALIAS("CP437", "IBM437"); ENC_REPLICATE("IBM737", "ASCII-8BIT"); -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp