PHP實現中文字元的無亂碼截斷
PHP內建的substr()函數不能對中文字元進行很好的截斷處理,對於一些中英文混合的字元會出現亂碼的情況。下面提供兩種解決函數。
?
1、GB2312編碼方式的截斷
?
function msubstr($str, $start, $len) { if (strlen($str)-$start < $len) return false; $tmpstr = ""; $strlen = $start + $len; for($i = 0; $i < $strlen; $i++) { if(ord(substr($str, $i, 1)) > 0xa0) { //0xa0 表示中文漢字編碼的第一個編碼字元ASCII 碼值都大於0xa0 $tmpstr .= substr($str, $i, 2); $i++; } else $tmpstr .= substr($str, $i, 1); } return $tmpstr . "...";}
?
2、utf8格式下的中文字元截斷
?
UTF-8編碼的字元可能由1~3個位元組組成, 具體數目可以由第一個位元組判斷出來。(理論上可能更長,但這裡假設不超過3個位元組)
第一個位元組大於224的,它與它之後的2個位元組一起組成一個UTF-8字元
第一個位元組大於192小於224的,它與它之後的1個位元組組成一個UTF-8字元
否則第一個位元組本身就是一個英文字元(包括數字和一小部分標點符號)。
?
//$sourcestr 是要處理的字串//$cutlength 為截取的長度(即字數)function cut_str($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, { $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;}
?
?
?
?
1 樓 zeroneta 2011-09-26
呵呵 那我就在來個 UTF-8截取無亂碼
function utf8( $a, $s = '' )
{
preg_match_all( '/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/', $a, $d, PREG_PATTERN_ORDER );
return join( $s, $d[0] );
}
2 樓 zeroneta 2011-09-26
調用方式
utf8( substr( '截取我', 0, 1 ) );
3 樓 bupt_roy 2011-09-29
zeroneta 寫道
調用方式
utf8( substr( '截取我', 0, 1 ) );
高手,學習學習,哈哈