天天看點

php截取中文字元串亂碼問題

<?php

function mulsubstr($str,$length){

if($length<=0){

//截取字元為0或負數,傳回空 字元串

return "";

}

$offset=0;//截取每個字元時最高位位元組的偏移量(位置),開始的時候截取第一個字元,該字元最高位位元組位置為0

$chars=0;//已經截取到的字元,開始時為0

$returnstr ="";//截取後傳回的字元串

while ($chars<$length) {

# 隻要已經截取到的字元沒有達到需要截取的就繼續截取

$highchar = decbin(ord(substr($str,$offset,1)));//得到每個字元最高位位元組編碼字元,根據該編碼字元判斷向後截取幾個位元組

if(strlen($highchar)<8){

//該字元占一個位元組時,按照上面的規律,傳回字元編碼二進制為0xxx xxxx的字元串形式,轉為二進制時開頭的0會舍棄,該位元組就隻有7位了,

//若此處使用if(substr($highchar,0,2)=='01'),則該判斷永遠不會生效,因為在decbin時最高位位元組為0會舍去,這樣就可以使用最高位位元組長度來判斷了,這點需要重點了解。

$cutbyte =1;//

}else if(substr($highchar,0,3)=='110'){

$cutbyte=2;

}else if(substr($highchar,0,4)=='1110'){

$cutbyte=3;

}else if(substr($highchar,0,5)=='11110'){

$cutbyte=4;

}

//判斷完對應字元編碼所占位元組後開始截取并拼接

$returnstr.=substr($str,$offset,$cutbyte);

$chars+=1;//繼續截取下一個字元

$offset+=$cutbyte;//下一個字元最高位元組偏移量

}

return $returnstr;//傳回需要截取的字元串

}

$str='中華人民共和國hean省洛陽市';

echo mulsubstr($str,12);

原文連結:http://www.linuxidc.com/Linux/2017-05/143989.htm