文字列の幅

最近はスクリプトを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のほうは、決められた長さ以上の文字列を切り詰める関数。
いま手がけている案件でこの関数が急遽必要となり、発作的にエントリーしてみた。
やっつけ仕事で恐縮だけど、必要な人はお試しあれ。

トラックバック

コメント

poozaが表示するの?


コメントはすぐには反映しません。
ほぼ毎日チェックしていますが、翌日以降の反映となることもあります。

Twitter