[#38782] [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

15 messages 2009/07/14
[#38784] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — Hidetoshi NAGAI <nagai@...> 2009/07/14

永井@知能.九工大です.

[#38790] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — "U.Nakamura" <usa@...> 2009/07/15

こんにちは、なかむら(う)です。

[#38791] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — Hidetoshi NAGAI <nagai@...> 2009/07/15

永井@知能.九工大です.

[#38792] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — "U.Nakamura" <usa@...> 2009/07/15

こんにちは、なかむら(う)です。

[#38793] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — Hidetoshi NAGAI <nagai@...> 2009/07/15

永井@知能.九工大です.

[#38794] Re: [Bug:trunk] Re: [ruby-cvs:31281] Ruby:r24063 (trunk): * ext/tk/extconf.rb: New strategy for searching Tcl/Tk libraries. — "U.Nakamura" <usa@...> 2009/07/15

こんにちは、なかむら(う)です。

[#38843] 複素数リテラルについて — Yukihiro Matsumoto <matz@...>

まつもと ゆきひろです

32 messages 2009/07/21
[#38855] Re: 複素数リテラルについて — Yusuke ENDOH <mame@...> 2009/07/22

遠藤です。

[#38857] Re: 複素数リテラルについて — Tadayoshi Funaba <tadf@...> 2009/07/22

> は十分検討されたのでしょうか。積極的に反対なわけではないですが、

[#38912] String#valid_encoding?にオプションが欲しい — Fujioka <fuj@...>

xibbarこと藤岡です。(なぜか届かないので再送します)

19 messages 2009/07/27
[#38918] Re: String#valid_encoding?にオプションが欲しい — "NARUSE, Yui" <naruse@...> 2009/07/27

成瀬です。

[#38925] Re: String#valid_encoding?にオプションが欲しい — Fujioka <fuj@...> 2009/07/27

xibbarです。

[#38927] Re: String#valid_encoding?にオプションが欲しい — Fujioka <fuj@...> 2009/07/28

xibbarです。

[#38914] [Bug #1819] Ruby-1.9.1を使用しDB(MySQL)接続時にエラー — Ryouhei Saita 斉田 <redmine@...>

Bug #1819: Ruby-1.9.1を使用しDB(MySQL)接続時にエラー

11 messages 2009/07/27

[#38932] Enumerator#peek — Tanaka Akira <akr@...>

Enumerator#peek を新設するのはどうでしょうか。

16 messages 2009/07/28

[ruby-dev:38918] Re: String#valid_encoding?にオプションが欲しい

From: "NARUSE, Yui" <naruse@...>
Date: 2009-07-27 16:52:31 UTC
List: ruby-dev #38918
成瀬です。

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>

In This Thread