持ちネタがありませんので,本日は,アンテナをざっとめぐって目についたものを.
ソースコードを見ますと,Shift-JIS用には「(txt.size / 2)」で,UTF-8用には「(txt.size / 3)」で,「約」の文字数を求めています.ですが,jcodeをロードしているなら,「txt.jsize」が使えます.
検証コードを:
#!/usr/bin/env ruby -Ks # jsize.rb # 文字コードはshift_jis require 'kconv' require 'jcode' str = '和歌山' puts str puts str.jsize puts str.tosjis.jsize puts str.toutf8.jsize
では実行.
$ ruby jsize.rb 和歌山 3 3 6
あれ…UTF-8の文字列にjcodeは使えない,ということでしょうか.
個人的によく使うのは,「文字列.split(//).size」です.Ruby 1.8でも,文字列の扱いが変わった1.9でも,正しく文字数をカウントできます.プログラムを書き換えてみます.
#!/usr/bin/env ruby -Ks # jsize.rb # 文字コードはshift_jis require 'kconv' require 'jcode' str = '和歌山' puts str puts str.tosjis.size puts str.toutf8.size puts str.split(//).size puts str.toutf8.split(//u).size
細かいことですが,str.tosjisにつくsizeは,Stringクラスのインスタンスメソッドで,str.split(//)につくsizeはArrayクラスのインスタンスメソッドです.
ともあれ再び実行*1.
$ ruby jsize.rb 和歌山 6 9 3 3
関連:
- プログラミング言語 Ruby リファレンスマニュアル
- http://redmine.ruby-lang.org/issues/show/261
- 日本語文字列の文字数 / $KCODEよりも-Kオプションで - rubyco(るびこ)の日記
- Ruby 初心者スレッド Part 20 (297-302)
297 :デフォルトの名無しさん:2008/07/12(土) 08:18:25 日本語での文字列の長さを取得したいと考えています jlengthを使っていたのですが、 マニュアルで 「jcode ライブラリはプロセス全体に影響するため、 中程度以上の規模プログラムで用いることは推奨できません。」 という記述を見つけました。 jcodeを使わずに文字列の長さを取得するにはどうしたらいいのでしょうか? 298 :デフォルトの名無しさん:2008/07/12(土) 08:21:36 このへんもマニュアルに書いてあるんだけどなあ str.split(//e).size ShiftJISな文字列の場合は正規表現を //s に 299 :デフォルトの名無しさん:2008/07/12(土) 08:30:53 もうそろそろ、全部UTF8にしちまう訳にはいかないのかねえ? 今となってはEUCとかSJISとか全部、言って見れば後方互換だろ? ここでする話では無いのかもしれんけど 300 :デフォルトの名無しさん:2008/07/12(土) 08:31:19 >>298 初心者が見つけられる位置になければ、書いてないのとおなじ 301 :297:2008/07/12(土) 08:50:33 >>298 ありがとうございました 302 :デフォルトの名無しさん:2008/07/12(土) 08:51:38 >>299 そうしたのがPython 「いや、どんなエンコーディングもそのまま扱えるようにすべき」 としたのがRuby1.9
*1:Ruby 1.8.7にて.