今天看到 奇遇 童鞋发表了一篇名叫《PHP截取UTF8字符串》的文章,里面阐述了平常我们使用的PHP截断函数截取UTF-8字符串时会出现乱码的情况。
于是我想到了现在正在使用的 PN2 主题貌似之前修改的时候有看到过那个截断函数,也仔细的看过,所以印象比较深刻,应该是没有考虑 奇遇 童鞋说的那种情况的。果不其然,经 奇遇 测试杯具的出现了乱码:

然后我坚决找到了主题中那个截断函数,对照了着修改,但由于水平有限,修改过程中,出现了各种乱码。无奈只能网上搜索,找到了 ZWW 童鞋写的《utf-8字符串截断函数》,如拨云见日,经过些许的修改,替换掉了原来的函数:
/**
* utf-8 字符串截取函数 edit by zwwooooo
* $sourcestr:要截取的字符串,默认空
* $i:开始截取地方,默认0
* $cutlength:截取长度(文字个数),默认100
* $endstr:截取后的字符串末尾字符串,默认是 “….”
*/
function imSubstr($sourcestr='',$cutlength=100,$i=0,$endstr='…'){
$str_length=strlen($sourcestr);//字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//ascii码
if ($ascnum>=224)
{
$returnstr=$returnstr.substr($sourcestr,$i,3);
$i=$i+3;
$n++;
}elseif ($ascnum>=192)
{
$returnstr=$returnstr.substr($sourcestr,$i,2);
$i=$i+2;
$n++;
}else
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1;
$n=$n+0.5;
}
}
if($i<$str_length)$returnstr.=$endstr;
return $returnstr;
}
* utf-8 字符串截取函数 edit by zwwooooo
* $sourcestr:要截取的字符串,默认空
* $i:开始截取地方,默认0
* $cutlength:截取长度(文字个数),默认100
* $endstr:截取后的字符串末尾字符串,默认是 “….”
*/
function imSubstr($sourcestr='',$cutlength=100,$i=0,$endstr='…'){
$str_length=strlen($sourcestr);//字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//ascii码
if ($ascnum>=224)
{
$returnstr=$returnstr.substr($sourcestr,$i,3);
$i=$i+3;
$n++;
}elseif ($ascnum>=192)
{
$returnstr=$returnstr.substr($sourcestr,$i,2);
$i=$i+2;
$n++;
}else
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1;
$n=$n+0.5;
}
}
if($i<$str_length)$returnstr.=$endstr;
return $returnstr;
}
当然,如果修改的话,你大可保留你之前的函数名,根据原先的函数调整参数位置,这样就省去了修改主题各个地方调用函数名的麻烦。
现在貌似问题已经解决,有空的童鞋麻烦测试下~~
» 转载请注明来源 » IM路人 » PHP UTF-8字符串截断函数







@ISayMe
这个我也不知道,应该要涉及到正则过滤吧~~不懂这个~~
测试这个部分文字也有乱码
悲剧乱码 出现几率比直接截取都高点
@恋月
暂时还没发现了有问题,不知道你是哪里看到的~~~
@luren
不是结尾 截取中部分字符很少数乱码