前幾天,去面試中遇到一個幫畢業就遇到的問題,PHP截取中文字元串亂碼問題。究其根本php的字元串截取函數是根據位元組來的,而漢字的編碼一需要的不單單一個位元組,那麼自然就會出現亂碼問題。
現在常用的編碼格式是UTF8,GBK,GBK2312,BIG5。GBK是GBK2312的更新。現在我開發中遇到的基本都是UTF8,GBK常用在論壇BBS上。今天自己寫了下UTF8的,測試下還說的過去,畢竟從網上拷下來的是可以用,但是如果有時間最好還是自己寫一下,這樣隻有到自己手裡的才是自己的。
今天寫了UTF8的中文字元截取,不單單是截取從零開始,可以指定位置開始,當然如果是中文那麼會中文下一個字元開始,結束是從指定的位置或者指定的漢字結束位置。
函數代碼:
function subUTF8str($str,$start=0,$length=80){
$str_length = strlen($str);//傳入字元串的位元組長度
$end_length = $start + $length; //8 //預計結束位元組
$cut_length = 0; //截取的位元組長度
$cut_end = $cut_begin = false; //初始化截取狀态
if($start >= $str_length){ //如果字元串開始位置大于字元串總長度 那麼傳回空
return null;
}
if( ($start == 0) && ($length >= $str_length) ){ //如果起始位置是0 截取長度大于等于總長度 直接傳回
return $str;
for($i=0; $i <= $str_length; $i++){
if( ($start <= $i) && ($cut_begin === false) ){//如果這一個判斷在第二個if後面則取下一個漢字為開頭
$cut_begin = $i;
}
if (ord($str[$i]) > 127){ //如果目前字元的ASCII 值大于127 則是認為是漢字
$i += 2; //UTF-8漢字是24位三個位元組 如果是漢字那麼增加兩位
$cut_begin?$cut_length += 3:null;
}else{
$cut_begin?$cut_length += 1:null;
if( ($end_length <= $i) && ($cut_end === false) ){
break;
return substr($str, $cut_begin , $cut_length );
}
整體測試代碼
header("Content-type:text/html;charset=UTF-8");
set_time_limit(0);
$str = '';
for($i=0;$i<1000;$i++){
$str .='這裡是截cefaACC截$%^&*截()_((截^&*^截*&%截%';
echo time().'<br/>';
$begin = rand(1,100);
$length = rand(1,1000);
echo subUTF8str($str,$begin,$length)."\n";
下次有機會寫其他編碼格式的
本文轉自kefirking 51CTO部落格,原文連結:,http://blog.51cto.com/phpzf/794660如需轉載請自行聯系原作者