在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节。
解决方法
UTF-8编码的字符可能由1-3个字节组成,具体数目可以由第一个字节判断出来。
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符,否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。
substr() 函数返回字符串的一部分。
语法
substr(string,start,length)
注意substr(1,2,3),第三个参数,截取返回的长度是按字节来的
<?php $a="我是程序员"; class Dx { private $str; public function Utf_substr($string,$start,$length) // utf-8编码的下截取规则 { if(strlen($string)>$length) { // $n=0; $str=""; $len=$start+$length; for($i=$start;$i<$len;$i++) { if(ord(substr($string,$i,1))>224) { $str.=substr($string,$i,3); // $n+=3; $i=$i+2; } elseif(ord(substr($string,$i,1))>192) { $str.=substr($string,$i,2); $i++; } else { $str.=substr($string,$i,1); } } return $str; } else { return $string; } } public function GB_substr($string,$start,$length) //gb2312 编码下的截取规则 { if(strlen($string)>$length) { $str=""; $len=$start+$length; for($i=$start;$i<$len;$i++) { if(ord(substr($string,$i,1))>0xa0) //如果ASCii码大于0xa0就是半个汉字; { $str.=substr($string,$i,2); $i++; } else { $str.=substr($string,$i,1); } } return $str; } else { return $string; } } } $sub = new Dx(); echo $sub->Utf_substr($a,0,8).'<br/>';//我是程序 ?> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 除了上面的方法,还可以使用mb_substr来解决,代码如下: <?php $a="wo的name是中国!"; echo mb_substr($a,0,9,'UTF-8');//wo的name是中 echo substr($a,0,15);//wo的name是中 ?>