PHP smarty截取中文乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP smarty截取中文乱码相关的知识,希望对你有一定的参考价值。

求一个方法替换原有的smarty截取类
不影响smarty原有的截取用法!灰常灰常的感谢!

给你一个强大的,这个很智能,汉子为两个字符宽度,英文为1 个。

function subString( &$str, $length = 0 , $start=0)

//$sourcestr 是要处理的字符串
//$cutlength 为截取的长度(即字数)
$sourcestr = $str ;
$cutlength = $length;

$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))

$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
if ($ascnum>=224) //如果ASCII位高与224,

$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1

elseif ($ascnum>=192) //如果ASCII位高与192,

$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1

elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,

$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符

else //其他情况下,包括小写字母和半角标点符号,

$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...


if ($str_length>$cutlength)
$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号

return $returnstr;


-------------------
是不是你想要的?不想要,继续追问哦。。。。
^_*追问

嘿嘿有么有直接改版好的 就是直接替换到smarty里面去的 俺比较懒

参考技术A gbk还是utf-8?
smarty截取不在主文件里,是在plugins目录下
modifier.truncate.php这个文件
根据编码不同有不同的智能截取函数追问

我要utf8的 你有么 有的共享下 谢谢了

追答

function smarty_modifier_truncate_utf($string, $length = 80, $etc = '...')


$result = '';
$string = html_entity_decode(trim(strip_tags($string)), ENT_QUOTES, 'utf-8');
for($i = 0, $j = 0; $i = $length)

for($x = 0, $y = 0; $x 0)); $i++)

if($number = strpos(str_pad(decbin(ord(substr($string, $i, 1))), 8, '0', STR_PAD_LEFT), '0'))

if($length

本回答被提问者采纳
参考技术B 把这句 改为

追问

???//什么啊

php解决中英混排字符串截取

当系统的字符存储设置了固定长度。

那存储的字符串如果过长,会造成程序异常或字符串被截断的情况。

如果通过php的系统函数substr()去截取字符串,遇到中文会造成截取异常(乱码字符)的情况。

改用mb_substr()去截取中英文,可以解决截取异常(乱码字符)的情况。

值得注意的是,substr()与mb_substr()的截取长度是有不同。

$str = '大家好-才是真的好';
echo substr($str,0,3);//出现截取异常,截取值:乱码字符
echo mb_substr($str,0,3);//截取正常,截取值:大家好 

而且,现实中系统设置字符的固定长度,通常是以英文字符,每个字符占1位为准的。

然而中文字符的占用是3位长度。

为了解决这个问题,可以判断传入字符串的每个字符在ASCII编码内的区域,根据区域不同位置使用不同的截取长度。

所以,通过自定义函数体去解决这个问题即可。

function common_substr($sourcestr, $cutlength) 
   $returnstr = '';
   $i = 0;
   $n = 0;
   $str_length = strlen ( $sourcestr ); //字符串的字节数 
   while ( ($n < $cutlength) and ($i <= $str_length) ) 
    $temp_str = substr ( $sourcestr, $i, 1 );
    $ascnum = ord ( $temp_str ); //得到字符串中第$i位字符的ascii码 
    if ($ascnum >= 224) //如果ascii位高与224,
        if($n+3>$cutlength)
            return $returnstr;
        
        $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据utf-8编码规范,将3个连续的字符计为单个字符  
        $i = $i + 3; //实际byte计为3
        $n +=3;
        //echo $n."\\n";
     elseif ($ascnum >= 192) //如果ascii位高与192,
        if( $n+2>$cutlength)
            return $returnstr;
        
        $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据utf-8编码规范,将2个连续的字符计为单个字符 
        $i = $i + 2; //实际byte计为2
        $n +=2;
     elseif ($ascnum >= 65 && $ascnum <= 90) //如果是大写字母,
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; //实际的byte数仍计1个
        $n ++; //但考虑整体美观,大写字母计成一个高位字符
    elseif ($ascnum >= 97 && $ascnum <= 122) 
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; //实际的byte数仍计1个
        $n ++; //但考虑整体美观,大写字母计成一个高位字符
     else //其他情况下,半角标点符号,
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; 
        $n = $n + 1;
    
   
   return $returnstr;

通过ASCII编码的规则,去判断每个字符在什么位置,去做定长截取。最后在拼接字符串。

这样截取的字符串,既满足了字符串限定的长度,也解决了截取过程中出现乱码字符的问题。

从而解决程序运行过程中出现的问题。

以上是关于PHP smarty截取中文乱码的主要内容,如果未能解决你的问题,请参考以下文章

php解决中文截取乱码问题

PHP实现中文截取无乱码

php截取中文字符串无乱码的方法

php截取中文无乱码

php截取中文字符串乱码问题

PHP 截取字符串后乱码的解决方案