String#trがうまく動かない
ソースの目的は小文字を大文字にして空白改行タブを取り除くことです。
どうも「ッ」が悪さしているみたいです。
なので、「ッ」だけ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の部分に書いて欲しいなぁ。