rubyで文字列のバイト単位での切り出し(UTF8→SJIS→UTF8)
一応以下で動くんだけど・・・・・
余りバイトの処理をNKFに任せていいのかな????
def sjis_byte_cut(utf_str,cut_byte_size) str_shiftjis = NKF.nkf('-xWs', utf_str) return NKF.nkf('-xSw', str_shiftjis[0,cut_byte_size]) end
ちなみにパフォーマンスですが、うちの環境で(Core2Duo(2.2GHz))100万回実行してだいたい10秒ぐらいかかりました
↓↓↓↓↓↓
1000000.times{ sjis_byte_cut("奈良美智アンケート応募中",11) #=>奈良美智アンケ }
追記
一応ちゃんとベンチとってみた(ライブラリ名は気にしないでw)
環境
Model Name: MacBook Pro Model Identifier: MacBookPro3,1 Processor Name: Intel Core 2 Duo Processor Speed: 2.2 GHz Number Of Processors: 1 Total Number Of Cores: 2 L2 Cache: 4 MB Memory: 4 GB Bus Speed: 800 MHz
コード
$KCODE='u' require 'benchmark' require 'rubygems' require 'km_string' $n = 10000 st1 = "ひらがな漢字カタカナ1234まじり" st2 = st1 * 100 p KmString::sjis_byte_cut(st1,5) p KmString::sjis_byte_cut(st1,13) p KmString::sjis_byte_cut(st1,16) p KmString::sjis_byte_cut(st1,18) p KmString::sjis_byte_cut(st1,21) p KmString::sjis_byte_cut(st1,22) Benchmark.bm do |job| job.report {$n.times do; KmString::sjis_byte_cut(st1,7); end} job.report {$n.times do; KmString::sjis_byte_cut(st2,7); end} job.report {$n.times do; KmString::sjis_byte_cut(st2,277); end} end
結果
"ひら" "ひらがな漢字カ" "ひらがな漢字カタカナ" "ひらがな漢字カタカナ12" "ひらがな漢字カタカナ1234" "ひらがな漢字カタカナ1234ま" user system total real 0.090000 0.000000 0.090000 ( 0.087741) 2.370000 0.020000 2.390000 ( 2.405928) 2.550000 0.010000 2.560000 ( 2.561285)