php smarty truncate UTF8乱码问题解决办法
估计不少玩smarty模板的小朋友都遇到过裁切乱码问题。特别是UTF8编码的。
以下代码保存为modifier.truncate2.php存到smartylibs下的plugin目录下
然后裁剪的时候用$v->content|truncate2:100
就搞定了。
如果不好用可能是缓存导致,请速度删除templates_c下的缓存文件(小编搞的时候遇到缓存问题。)
<?php /** *Smartyplugin *@packageSmarty *@subpackageplugins */ /** *Smartytruncatemodifierplugin * *Type: modifier<br> *Name: truncate<br> *Purpose: Truncateastringtoacertainlengthifnecessary, * optionallysplittinginthemiddleofaword,and * appendingthe$etcstringorinserting$etcintothemiddle. *@linkhttp://smarty.php.net/manual/en/language.modifier.truncate.php * truncate(Smartyonlinemanual) *@author MonteOhrt<monteatohrtdotcom> *@paramstring *@paraminteger *@paramstring *@paramboolean *@paramboolean *@returnstring */ functionsmarty_modifier_truncate2($string,$length=80,$etc='...',$count_words=true){ return$returnstr=substr_utf8($string,0,$length).$etc; } functionsubstr_utf8($str,$start=0,$length=-1,$return_ary=false){ $len=strlen($str);if($length==-1)$length=$len; $r=array(); $n=0; $m=0; for($i=0;$i<$len;$i++){ $x=substr($str,$i,1); $a=base_convert(ord($x),10,2); $a=substr('00000000'.$a,-8); if($n<$start){ if(substr($a,0,1)==0){ }elseif(substr($a,0,3)==110){ $i+=1; }elseif(substr($a,0,4)==1110){ $i+=2; } $n++; }else{ if(substr($a,0,1)==0){ $r[]=substr($str,$i,1); }elseif(substr($a,0,3)==110){ $r[]=substr($str,$i,2); $i+=1; }elseif(substr($a,0,4)==1110){ $r[]=substr($str,$i,3); $i+=2; }else{ $r[]=''; } if(++$m>=$length){ break; } } } return$return_ary?$r:implode("",$r); } /*vim:setexpandtab:*/ ?>
samrty的插件体系还是比较智能而且容易修改的。