<?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