読者です 読者をやめる 読者になる 読者になる

String#trがうまく動かない

Ruby

ソースの目的は小文字を大文字にして空白改行タブを取り除くことです。
どうも「ッ」が悪さしているみたいです。
なので、「ッ」だけgsubにしてみた。

def str_upcase(str)
  oldkcode=$KCODE
  $KCODE="UTF-8"
  result=str.tr("ャュョァィゥェォ","ヤユヨアイウエオ").gsub(//,'')
  result.gsub!(/ | |\r|\n|\t/,'')
  $KCODE=oldkcode
  result
end

次に、gsubでtrをがんばってみました。

class String
  def utf8tr(from,to) # toがfromより短いと例外よ。
    $KCODE="UTF-8"
    from_arr=from.split //
    to_arr=to.split //
    raise "Size error" if from_arr.size > to_arr.size
    self.split(//).map{|str|
      from_arr.each_with_index{|from,number|
        str.sub!(/#{from}/,to_arr[number])
      }
      str
    }.join
  end
end

ベンチマーク
前者
real 0m0.140s
user 0m0.136s
sys 0m0.004s
後者
real 0m3.911s
user 0m3.500s
sys 0m0.408s
後者の大負け。onz
もうちょっと負けなかったら採用だったけど、まあしかたないか。

追記

FAQによると
http://www.ruby-lang.org/ja/man/?cmd=view;name=FAQ%3A%3A%C6%FC%CB%DC%B8%EC%A4%CE%BC%E8%A4%EA%B0%B7%A4%A4#a10.2e5.20tr.28.22.a4.a2.22.2c.22a.22.29.a4.ac.a4.a6.a4.de.a4.af.c6.b0.a4.ad.a4.de.a4.bb.a4.f3
require 'jcode'
で解決するようです。FAQじゃなくて、リファレンスのtrの部分に書いて欲しいなぁ。