From: Fujioka Date: 2009-07-29T22:12:41+09:00 Subject: [ruby-dev:38939] Re: String#valid_encoding?にオプションが欲しい xibbarです。 Fujioka wrote:: > xibbarです。 > > String#assume_encoding(encoding) > を追加するというのはいかがでしょう?>まつもとさん > なるせさんのパッチだと、encodingの変更に失敗したときに ascii-8bitに強制変更するようになっています。 これだと驚き最小の法則にひっかかると思いました。 encodingの変更に失敗したときはそのまま元のstringを返すのが いいのではないでしょうか? もしくはnilを返すか。 私のユースケースではascii-8bitからutf-8やeuc-jpへの変換なので どちらでも特に問題はないのですが、 rubyのポリシーとしてはどうなんだろうと思いまして。 文字列のencodingが間違っていてうれしいことは何も無いといえば まあその通りだとは思うのですが、はて。 Index: string.c =================================================================== --- string.c (revision 24163) +++ string.c (working copy) @@ -7090,6 +7090,27 @@ /* * call-seq: + * str.assume_encoding(encoding) => str + * + * If a string can be encoded correctly in the given encoding, + * changes the encoding to +encoding+ and returns self; + * otherwise, returns original string. + */ + +static VALUE +rb_str_assume_encoding(VALUE str, VALUE encoding) +{ + rb_encoding *enc = rb_to_encoding(encoding); + int cr = coderange_scan(RSTRING_PTR(str), RSTRING_LEN(str), enc); + + if (cr != ENC_CODERANGE_BROKEN) { + ENCODING_CODERANGE_SET(str, rb_enc_to_index(enc), cr); + } + return str; +} + +/* + * call-seq: * str.ascii_only? => true or false * * Returns true for a string which has only ASCII characters. @@ -7531,6 +7552,7 @@ rb_define_method(rb_cString, "encoding", rb_obj_encoding, 0); /* in encoding.c */ rb_define_method(rb_cString, "force_encoding", rb_str_force_encoding, 1); rb_define_method(rb_cString, "valid_encoding?", rb_str_valid_encoding_p, 0); + rb_define_method(rb_cString, "assume_encoding", rb_str_assume_encoding, 1); rb_define_method(rb_cString, "ascii_only?", rb_str_is_ascii_only_p, 0); id_to_s = rb_intern("to_s");