Rubyをインストールし、使っていると、
Windowsでプログラムしていると、
コマンドプロンプトの設定はsjisのままがいいけど、Rubyファイルはutf8で扱いたい。なんてことがよくあると思います。(俺だけ?)
で、その何が問題かと言うと、
「Rubyファイルの文字コードをutf8で保存すると、printやputsで出力したときに日本語が文字化けする」ってことです。
じゃあRubyファイルをsjisにするか、コマンドプロンプトをutf8にしろよっていう声が聞こえてきそうですが、
Rubyファイルはutf8じゃないといろいろと問題があって、コマンドプロンプトは他のsjisのプログラムが実行しにくくなるので嫌です。
ということで、出力するときの文字コードを指定できるメソッドを書いてみました。
#!/usr/bin/ruby $CCODE = 's' require 'nkf' def cputs(s,icode="") if icode!="" case icode[0,1].upcase when 'W' then i=icode when 'U' then i='W' when 'I' then i='J' else i=icode[0,1] end else i='' end if $CCODE!="" case $CCODE[0,1].downcase when 'w' then o=$CCODE when 'u' then o='w' when 'i' then o='j' else o=$CCODE[0,1] end else puts s;return false end puts NKF.nkf("-#{o}#{i}xm0", s) return true end def cprint(s,icode="") if icode!="" case icode[0,1].upcase when 'W' then i=icode when 'U' then i='W' when 'I' then i='J' else i=icode[0,1] end else i='' end if $CCODE!="" case $CCODE[0,1].downcase when 'w' then o=$CCODE when 'u' then o='w' when 'i' then o='j' else o=$CCODE[0,1] end else print(s);return false end print(NKF.nkf("-#{o}#{i}xm0", s)) return true endcputsがputsの文字コード指定版で、cprintがprintの文字コード指定版です。
cputs "こんにちわ" cprint "ハロー, 世界。"とすれば文字コードを変換して出力します。
Rubyのifとcase、どちらの処理が速いのかベンチマークを測定してみた。
標準でbenchmarkというライブラリがあるが、どうも使いにくいので簡単にやります。
2通りの結果しかない場合は、if、elseを使えば良いと思うので、
3通りに条件を分岐するという前提でやってみます。
a="d" n=1000000 st=Time.now n.times{ if a=="a" elsif a=="b" elsif a=="c" else end } puts "if Times: #{Time.now-st}s" st=Time.now n.times{ case a when "a" when "b" when "c" else end } puts "case Times: #{Time.now-st}s"100万回回してみました。