[#38725] [Bug #1720] [NaN] == [NaN] が true になる — tadayoshi funaba <redmine@...>
Bug #1720: [NaN] == [NaN] が true になる
[#38731] FreeBSD で ruby-mecab のライブラリ参照の不具合 — "KISHIMOTO, Makoto" <ksmakoto@...4u.or.jp>
きしもとです
[#38762] Re: [ruby-cvs:31110] Ruby:r23892 (trunk): * rational.c (float_to_r): always returns rational. — "Yugui (Yuki Sonoda)" <yugui@...>
On 6/29/09 8:31 PM, tadf@ruby-lang.org wrote:
[#38782] [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
永井@知能.九工大です.
こんにちは、なかむら(う)です。
永井@知能.九工大です.
こんにちは、なかむら(う)です。
永井@知能.九工大です.
こんにちは、なかむら(う)です。
永井@知能.九工大です.
永井@知能.九工大です.
こんにちは、なかむら(う)です。
押田です。
[#38821] セキュリティモデルのドキュメント — Shugo Maeda <shugo@...>
前田です。
[#38836] ext/tk/extconf.rb creates a file in $srcdir — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
[#38843] 複素数リテラルについて — Yukihiro Matsumoto <matz@...>
まつもと ゆきひろです
> * 互換性はどうか。大丈夫のはずだが、見落としは
遠藤です。
> は十分検討されたのでしょうか。積極的に反対なわけではないですが、
遠藤です。
> 読み書きがやさしいのはわかるんですが、1+2i が書けても 1+ni が書けない
[#38850] Rational#hash — Tadayoshi Funaba <tadf@...>
いつだったか、rational などの hash が変ったようですが、意味が解っていな
[#38900] rb_eval_string_protect and encoding — Masaki Suketa <masaki.suketa@...>
助田です。
なかだです。
助田です。
[#38912] String#valid_encoding?にオプションが欲しい — Fujioka <fuj@...>
xibbarこと藤岡です。(なぜか届かないので再送します)
成瀬です。
xibbarです。
xibbarです。
まつもと ゆきひろです
成瀬です。
まつもと ゆきひろです
[#38924] thread switch hook for RubyCocoa — Nobuyoshi Nakada <nobu@...>
なかだです。
木村わ@RubyCocoaチーム/MacPorts port:rubyメンテナです。
木村わ@RubyCocoaです。
[#38932] Enumerator#peek — Tanaka Akira <akr@...>
Enumerator#peek を新設するのはどうでしょうか。
けいじゅ@いしつかです.
In article <E1MVnmx-00046e-PP@keiju.ishitsuka.com>,
けいじゅ@いしつかです.
In article <E1MW8kB-0001fM-56@keiju.ishitsuka.com>,
[#38938] Re: [ruby-list:46234] Re: irbでの式展開中の動作について — keiju@... (石塚圭樹)
けいじゅ@いしつかです.
[#38971] [Bug #1848] Net::SSH hangs — Shyouhei Urabe <redmine@...>
Bug #1848: Net::SSH hangs
チケット #1848 が更新されました。 (by Shyouhei Urabe)
Shyouhei Urabe さんは書きました:
[ruby-dev:38918] Re: String#valid_encoding?にオプションが欲しい
成瀬です。
Fujioka wrote:
> xibbarこと藤岡です。(なぜか届かないので再送します)
「Fromの.jpがjpになってたのでrejectだった」とのことです。
> String#valid_encoding?に
> チェックしたいencodingをオプションで渡せるようになると便利です。
>
> 例えばascii-8bitなバイト列があって、
> もしutf-8に変換可能だったら変換したいというときに
> 現状では
>
> str.force_encoding(Encoding::UTF_8)
> unless str.valid_encoding?
> str.force_encoding(Encoding::ASCII_8BIT)
> end
>
> とする必要があります。
> いったんencodingを強制変更してencodingをチェックし、
> だめだったら元に戻すという作業をしなければなりません。
> もし、String#valid_encoding?(encoding=nil)
> というオプションをとれるときは
>
> if str.valid_encoding(Encoding::UTF_8)
> str.force_encoding(Encoding::UTF_8)
> end
>
> となってすっきりです。
これですが、文法上はすっきりする裏で、パッチを書けばおわかりの通り、
無駄なオブジェクトを作った上に、coderange_scanの結果を捨ててしまいます。
言い換えると、文法的な汚さとは裏腹に、現状の方が処理系にとっては綺麗なのです。
ゆえに、String#valid_encoding?(enc)を追加してしまうと効率が悪いが一見綺麗な
書き方を推奨してしまうことになるので、当分の間は採用できません。
代替案としては、force_encodingとvalid_encoding?を、
同時に行うメソッドを新設するという案があります。
% irb19
irb(main):001:0> s="\u3042"
=> "あ"
irb(main):002:0> s.force_encoding("binary")
=> "\xE3\x81\x82"
irb(main):003:0> s.assume_encoding("SJIS")
=> "\xE3\x81\x82"
irb(main):004:0> s.encoding
=> #<Encoding:ASCII-8BIT>
irb(main):005:0> s.assume_encoding("UTF-8")
=> "あ"
irb(main):006:0> s.encoding
=> #<Encoding:UTF-8>
diff --git a/string.c b/string.c
index 34f35b8..89985b6 100644
--- a/string.c
+++ b/string.c
@@ -7090,6 +7090,30 @@ rb_str_valid_encoding_p(VALUE str)
/*
* 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, set encoding as ASCII-8BIT.
+ */
+
+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) {
+ rb_enc_associate(str, rb_ascii8bit_encoding());
+ }
+ else {
+ 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 +7555,7 @@ Init_String(void)
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");
--
NARUSE, Yui <naruse@airemix.jp>