//$str 待截取的字符串
//$len 截取的字符个数
//$chars 已经截取的字符数
//$res 保存的字符串
//$chars 保存已经截取的字符串个数
//$offset 截取的偏移量
//$length 字符串的字节数
//若$len>$str的字符个数,造成无谓的while循环,($offset
function utf8sub($str,$len){
if($len<&#61;0){
return ;
}
$res&#61;"";
$offset&#61;0;
$chars&#61;0;
$length&#61;strlen($str);
while($chars
$hign&#61;decbin(ord(substr($str,$offset,1)));
if(strlen($hign)<8){
$count&#61;1;
}elseif(substr($hign,0,3)&#61;&#61;"110"){
$count&#61;2;
}elseif(substr($hign,0,4)&#61;&#61;"1110"){
$count&#61;3;
}elseif(substr($hign,0,5)&#61;&#61;"11110"){
$count&#61;4;
}elseif(substr($hign,0,6)&#61;&#61;"111110"){
$count&#61;5;
}elseif(substr($hign,0,7)&#61;&#61;"1111110"){
$count&#61;6;
}
$res.&#61;substr($str,$offset,$count);
$offset&#43;&#61;$count;
$chars&#43;&#61;1;
}
return $res;
}
function utf8sub1($str,$len){
$chars&#61;0;
$res&#61;"";
$offset&#61;0;
$length&#61;strlen($str);
while($chars
$hign&#61;decbin(ord(substr($str,$offset,1)));
if(strlen($hign)<8){
$count&#61;1;
}elseif($hign & "11100000"&#61;&#61;"11000000"){
$count&#61;2;
}elseif($hign & "11110000"&#61;&#61;"11100000"){
$count&#61;3;
}elseif($hign & "11111000"&#61;&#61;"11110000"){
$count&#61;4;
}elseif($hign & "11111100"&#61;&#61;"11111000"){
$count&#61;5;
}elseif($hign & "11111110"&#61;&#61;"11111100"){
$count&#61;6;
}
$res.&#61;substr($str,$offset,$count);
$chars&#43;&#43;;
$offset&#43;&#61;$count;
}
return $res;
}
$a&#61;"中华ah人民hdj";
echo utf8sub($a,5);
?>