わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

文字数カウンタ

持ちネタがありませんので,本日は,アンテナをざっとめぐって目についたものを.

ソースコードを見ますと,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

関連:

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にて.