• ベストアンサー

半角と全角の文字数カウント方法

半角の一文字を1とカウントし、全角の一文字も1とカウントしたいのですが、うまい方法を教えてください。 例) 1111ああああ → 8文字 11111111 → 8文字 ああああああああ → 8文字 自分なりに調べて見たら以下の命令を見つけたのですが、うまく行かないのです。 $n =~ tr/\x00-\x7f/\x00-\x7f/; $nn =~ tr/\xa1-\xfe/\xa1-\xfe/; 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • nipotan
  • ベストアンサー率59% (134/227)
回答No.1

参考 URL をご覧頂ければわかると思いますが、文字を分割して配列にする方法が出ています。 EUC-JP じゃないと分割できないので、適宜 EUC-JP にコンバートします。 以下のサンプルのようにしてみるとわかりやすいと思います。 --- require 'jcode.pl'; foreach(qw(1111ああああ 11111111 ああああああああ こんにちは 教えて!goo OKWeb)){ print '"' . $_ . '" は ' . strlength($_) . ' 文字です' . "\n"; } sub strlength { my $str = shift; jcode::convert(\$str, 'euc'); my @buf = $str =~ /([\x00-\x7f]|[\x8e\xa1-\xfe][\xa1-\xfe]|\x8f[\xa1-\xfe][\xa1-\xfe])/og; scalar @buf; } --- HTML だとインデントが見にくいかも知れませんが、こんな感じで、大体正確にカウントできると思います。 必ず require 'jcode.pl' (あるいは use Jcode) して、上記 strlength 関数を書けば、 --- ★ = strlength(☆); ★ ... 文字数 ☆ ... 対象文字列 --- という関数で、お望みの処理が簡単に扱えるようになります。 なお、jcode.pl を使わずに use Jcode した場合は、 jcode::convert(\$str, 'euc'); の行の先頭を大文字に、 Jcode::convert(\$str, 'euc'); として行ってください。

参考URL:
http://www.din.or.jp/~ohzaki/perl.htm#JP_Split
abiru
質問者

お礼

ありがとうございました。 gooからのメールに気がつかなくて返事が遅れてしまい、すいませんでした。

関連するQ&A