文字列の幅
2008/03/26 22:55
最近はスクリプトをUTF-8で書くことが多いと思う。
ぼくがUTF-8を使う様になって、EUC-JPやShift_JISと比べて不便に感じるのは、文字列の幅を知るのが難しいってこと。
strlen関数を使えばって?まぁ聞いてくれ。確かにstrlenを使えば、バイト単位での文字列の長さが返り、それは等幅フォントを用いた表示上の幅と、ほとんどの場合等しい。この便利な特徴が、UTF-8にはないのである。
strlenもmb_strlenもこの要件は満たさず、役に立たない。
ならば、EUC-JPに変換した文字列に対してstrlenすればよいのでは?
function getStringWidth ($str) {
return strlen(
mb_convert_encoding($str, 'eucjp-win', mb_internal_encoding())
);
}
function truncateString ($value, $length, $suffix = '...') {
if (is_array($value)) {
foreach ($value as $key => $item) {
$value[$key] = truncateString($item, $length, $suffix);
}
} else if ($length < getStringWidth($value)) {
$value = mb_convert_encoding($value, 'eucjp-win', mb_internal_encoding());
$value = mb_strcut($value, 0, $length, 'eucjp-win') . $suffix;
$value = mb_convert_encoding($value, mb_internal_encoding(), 'eucjp-win');
}
return $value;
}
print truncateString('あいうえお', 5);
もうひとつのtruncateStringのほうは、決められた長さ以上の文字列を切り詰める関数。
いま手がけている案件でこの関数が急遽必要となり、発作的にエントリーしてみた。
やっつけ仕事で恐縮だけど、必要な人はお試しあれ。
