perlでUTF-8の文字列を切り出す。

perlにて、UTF-8の文字列(日本語)をある特定の文字数(バイト数)で切り出しする必要があり、いろいろ調べているうち、次のサブルーチンを見つけました。

文字列を任意のバイト数で切り出しを行い、半端なバイト数である(UTF-8として成り立たない)場合にはその末尾を自動的に調整してくれます。大変に助かりました!

sub strcutbytes_utf8 {
my ($src, $maxlen) = @_;
my $srclen = length($src);
my $srcpos = 0;
while($srcpos < $srclen) {
my $character = substr($src, $srcpos, 1);
my $value = ord($character);
if($value < 0x80) { # ASCII characters
$srcpos ++;
next;
}
my $width = 6;
$width = 5 if($value < 0xFC);
$width = 4 if($value < 0xF8);
$width = 3 if($value < 0xF0);
$width = 2 if($value < 0xE0);
my $nextpos = $srcpos + $width;
last if($nextpos > $maxlen);
last if($nextpos > $srclen); # sequence is incomplete
$srcpos = $nextpos;
}
return substr($src, 0, $srcpos);
}

参照