日本語文字列の文字数 / $KCODEよりも-Kオプションで
artonさんのところで話題になっていたので、わたしも書いてみました。無駄に複雑にしています。てへ♪
でも、each_charって便利ではないでしょうか。
$KCODE = 'SJIS' class String def each_char scan(/./) do |c| yield(c) end end def char_count n = 0 each_char do n += 1 end n end end p "日本語".char_count "日本語".each_char do |c| puts c end
実行結果です。
3 日 本 語
- 参考: artonさん
追記:artonさんから、「$KCODEよりも-Kで」という情報をいただきました。理由はshe bang行に-Kで書いておくと読み込み時に評価してくれるから、とのこと。あっ、Windows版でもちゃんと読むんですねっ♪ 実験、実験。
#!/usr/local/bin/ruby -Ks puts $KCODE #=> SJIS
#!/usr/local/bin/ruby -Ke puts $KCODE #=> EUC
#!/usr/local/bin/ruby -Ku puts $KCODE #=> UTF8
#!/usr/local/bin/ruby -Kn puts $KCODE #=> NONE
ほんとだ…。じゃあ、「はまる」例を実際に作ってみますね。
$KCODE = SJIS puts '表' #=> unterminated string meets end of file
#!/usr/local/bin/ruby -Ks puts '表' #=> 表
確かに、artonさんのご指摘通りでした。感謝です♪
スクリプトではなく外部ファイルの読み込みについては、$KCODEへの代入で、という話題もありましたが、それはまたいつか試します。
追記:id:nurseさんから、リンク情報をいただきました。感謝♪
追記:id:nurseさんから、block_given? と /./m という追加情報をいただきました。なるほど、mオプション(Regexp::MULTILINE)を付けると、改行を含んでいたときに、その改行も一個の「文字」としてとれますね。ありがとうございます。