utf8フラグ付き文字の場合、length()とかsubstr()とかはバイト単位でなくて、文字単位で扱ってくれてすごい便利。 で、printfの文字列指定子である「%s」も文字単位で扱うようになる。 そのせいで、2バイト表記文字のフォーマットが崩れちゃう。 use strict; use warnings; use utf8; my $sb_str = 'abcde'; my $mb_str = 'ぁぃぅぇぉ'; printf "%-10s : %d\n", $sb_str, length($sb_str); printf "%-10s : %d\n", $mb_str, length($mb_str); abcde : 5 ぁぃぅぇぉ : 5 欲しかったのは abcde : 5 ぁぃぅぇぉ : 5 なのに! うまい方法わからなかった! 仕方ないのでこんな書いて sub mb_count