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的插件体系还是比较智能而且容易修改的。