代码二里边我做了一下修改,增加参数:$mb_str_length = mb_strlen($sourcestr,'utf-8');
同时将加省略号的地方改成这样:$mb_str_length > $cutlength而不是原来的$str_length > $cutlength
因为原来的在计算中英文混合字符串的时候,有问题!
PHP代码一 代码:复制
* PHP截取UTF-8字符串,解决半字符问题。 * 英文、数字(半角)为1字节(8位),中文(全角)为3字节 * @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串 * @param $str 源字符串 * $len 左边的子串的长度 function utf_substr($str,$len){ for($i=0;$i<$len;$i++){ $temp_str=substr($str,0,1); if(ord($temp_str) > 127){ $i++; if($i<$len){ $new_str[]=substr($str,0,3); $str=substr($str,3); } }else{ $new_str[]=substr($str,0,1); $str=substr($str,1); } } return join($new_str); } 例子一: $str = utf_substr('你好',4); echo $str;
PHP代码二 代码:复制
function cut_str($sourcestr,$cutlength){ $returnstr = ''; $i = 0; $n = 0; $str_length = strlen($sourcestr);//字符串的字节数 $mb_str_length = mb_strlen($sourcestr,'utf-8'); while (($n < $cutlength) && ($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 ($mb_str_length > $cutlength){ $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号 } return $returnstr; } $str = '你好!我好'; $str = cut_str($str,3); echo $str;