sasadong 发表于 2006-10-30 03:40

让smarty完全支持中文,truncate修饰器改造

我们知道,smarty模板的truncate支持单字符和双字符的截断,这对于使用gbk或者big5的数据来说真是一个幸福。
但如果是使用utf-8编码的中文呢,utf-8中文使用到3个byte的空间来存储一个中文,这样子truncate修饰器截断的中文就可能导致“破碎的残块”,出现“?”符号。
为了不影响原来truncate的功能,我增加了truncate_utf8修饰器解决了这个问题。其原理是通过regex对utf-8编码标准的解析达到正确截断的目的。


function smarty_modifier_truncate_utf8($string, $length = 80, $etc = '...',
                                  $break_words = false, $middle = false)
{
    if ($length == 0)
      return '';

    if (strlen($string) > $length) {
                                $sPatten = '/(?:[\xe0-\xef][\x80-\xbf]?|[\xc0-\xcf])$/' ;
      $length -= strlen($etc);
      if (!$break_words && !$middle) {                                               
                                                $string = preg_replace( $sPatten, '', substr($string, 0, $length ) );
      }
      if(!$middle) {
            return substr( $string, 0, $length ) . $etc;
      } else {
            return preg_replace( $sPatten, '', substr($string, 0, $length/2 ) ) . $etc . preg_replace( $sPatten, '', substr($string, 0, -$length/2 ) );
      }
    } else {
      return $string;
    }
}

iptton 发表于 2008-4-11 01:19

顶上去,近期可能会用到...
页: [1]
查看完整版本: 让smarty完全支持中文,truncate修饰器改造