end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

perlで全角=2文字,半角=1文字で文字列長を算出する

http://d.hatena.ne.jp/end0tknr/20090316/1237158571

以前、書いた \p{In〜}によるblock正規表現に関連する内容です。


「use utf8;」の場合、全角or半角に関わらず1文字として扱ってしまうので、次のように書けば、全角=2文字,半角=1文字で文字列長を算出できます。

#!/usr/local/bin/perl
use strict;
use utf8;

main();

sub main {
    my @STRS = qw/123 東京 東京123/;

    for my $str (@STRS){
	my @not_asciis = $str =~ /[^\p{InBasicLatin}]/go;
	my $ret_len = length($str) + scalar(@not_asciis);
	print STDERR "$ret_len\n";
    }
}

ん? 待てよ。次のようにEncode::encode()を使っても良い気がします。

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;

main();

sub main {
    my @STRS = qw/123 東京 東京123/;

    for my $str (@STRS){
	my $ret_len = length(encode('cp932',$str));
	print STDERR "$ret_len\n";
    }
}