はじめまして.永井@知能.九工大と申します.

ruby の勉強を始めて 10 日程度の初心者です.
jcode.rb に関連して二点ほど質問があります.

一点目は mbchar? についてですが,
これはなぜこのような仕様になっているのでしょうか.
現在の仕様ではある s という String に 2byte 文字が含まれているかを
確認したい場合,メソッド mbchar?(s) を何らかの String オブジェクトに
渡してやる必要があるように見えます.
この受け手のオブジェクトは mbchar? には何の関係もないものですから,
どうにも不自然に感じます.
s.mbchar? とする方が自然に感じるのですが...
ML の過去ログは量が多すぎて調べていません.
# すみません (_O_)
もし何らかの議論の末,このような仕様となっているのでしたら,
そのポインタを教えていただけると幸いです.

二点目は squeeze というか,gsub に関することです.
jcode.rb での squeeze の再定義では,

   self.gsub!(/(.|\n)\1+/, '\1')

という処理が行われていますが,これが期待するように動いていないようです.
ruby-1.1b9 を Linux (kernel2.0.33, libc.so.5.4.38), gcc-2.7.2.3 の環境です.
たとえば,"aaaaabbbbccc".gsub(/(.|\n)\1+/, '\1')
は "aaabbccd" となりますし,
"aaaaabbbbccc".gsub(/(.|\n)(\1)+/, '\1')
としても "aaabbccd" となります.
"aaaaabbbbccc".gsub(/(.|\n)\1\1*/, '\1')
の場合も "aaabbccd" となります.
"aaaaabbbbccc".gsub(/(.|\n)(?:\1)+/, '\1')
とした場合に,ようやく "abcd" となります.
どうも参照と + や * の組が期待通りではないように見えます.

以上の二点のため,とりあえず以下のようにパッチをあてて使っています.
------------------------------------------------------------
--- jcode.rb.orig	Thu Mar 26 13:06:52 1998
+++ jcode.rb	Thu Mar 26 13:07:01 1998
@@ -11,11 +11,11 @@
   alias original_succ succ
   private :original_succ
 
-  def mbchar?(c)
+  def mbchar?
     if $KCODE =~ /^s/i
-      c =~ /[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]/n
+      self =~ /[\x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]/n
     elsif $KCODE =~ /^e/i
-      c =~ /[\xa1-\xfe][\xa1-\xfe]/n
+      self =~ /[\xa1-\xfe][\xa1-\xfe]/n
     else
       FALSE
     end
@@ -25,7 +25,7 @@
     if self[-2] && self[-2] & 0x80 != 0
       s = self.dup
       s[-1] += 1
-      s[-1] += 1 if !mbchar?(s)
+      s[-1] += 1 if !s.mbchar?
       return s
     else
       original_succ
@@ -41,7 +41,7 @@
       if self[0..-2] == to[0..-2]
 	first = self[-2].chr
 	for c in self[-1] .. to[-1]
-	  if mbchar?(first+c.chr)
+	  if first+c.chr.mbchar?
 	    yield self[0..-2]+c.chr
 	  end
 	end
@@ -137,7 +137,7 @@
       end
       adel = del._expand_ch
       if comp
-	self.gsub!(/(.|\n)\1+/) do
+	self.gsub!(/(.|\n)(?:\1)+/) do
 	  next unless adel.include?($1)
 	  $&
 	end
@@ -149,7 +149,7 @@
       end
       self
     else
-      self.gsub!(/(.|\n)\1+/, '\1')
+      self.gsub!(/(.|\n)(?:\1)+/, '\1')
     end
   end
 
------------------------------------------------------------

-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp