smarty截取中文乱码问题解决办法转载

网站的页面在展现时,为了美观,经常需要对一些标题的长度进行控制。在整个程序中,到处都是那忙碌的字符串截取函数,而且还可能出现中文乱码。用mb_substr()可以比较好的截取中文,但是它把中文和英文都按一个字符处理,截取的效果感觉不是太好。

如果你是用Smarty做表现层的话,可以用smarty的变量调节器truncate方法来控制字符串的长度,当然利用Smarty自己的truncate截取中文时,会出现乱码。我们可以改写它的truncate调节器,让它来帮我们截取字符串,达到一劳永逸的效果。

找到你的Smarty安装目录,打开plugins/modifier.truncate.php文件。你可以用下面的函数替换掉smarty自己的函数。

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

      if (strlen($string) > $length) {
          $length -= min($length, strlen($etc));
          for($i = 0; $i < $length ; $i++) {
     $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
    }
    return $strcut.$etc;  
        
      } else {
          return $string;
      }
}

参数$length:为截取字符串的最大长度,默认为80字符,一个中文按2个字符计算;$etc:截取字符串时,自动附加在后面的符号。默认为(...);$break_words 本指为是否可以打断一个单词,在中文环境下,作用不大,在改写的方法中,后面两个参数不起什么作用。

最后说下使用,{$title|truncate:30:"..."} ,很简单不是?当然这30个字符的长度还包括(...),如果你不喜欢,可以自己修改上面代码中的一行。

原文地址:https://www.cnblogs.com/zhangqifeng/p/1732996.html