本文共 1796 字,大约阅读时间需要 5 分钟。
GBK:
<?php
function mysubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
for($i = 0; $i < $strlen; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} else
$tmpstr .= substr($str, $i, 1);
}
return$tmpstr;
}
?>
今天发现(2014-02-11)上面方法不靠谱,还是出现了乱码,用下面这个就可以了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | function sysSubStr( $String , $Length , $Append = false) { if ( strlen ( $String ) <= $Length ) { return $String ; } else { $I = 0; while ( $I < $Length ) { $StringTMP = substr ( $String , $I ,1); if ( ord( $StringTMP ) >=224 ) { $StringTMP = substr ( $String , $I ,3); $I = $I + 3; } elseif ( ord( $StringTMP ) >=192 ) { $StringTMP = substr ( $String , $I ,2); $I = $I + 2; } else { $I = $I + 1; } $StringLast [] = $StringTMP ; } $StringLast = implode( "" , $StringLast ); if ( $Append ) { $StringLast .= "..." ; } return $StringLast ; } } |
UTF-8:
<?php
function utfSubstr($str, $position, $length,$type=1){
$startPos = strlen($str);
$startByte = 0;
$endPos = strlen($str);
$count = 0;
for($i=0; $i<strlen($str); $i++){
if($count>=$position && $startPos>$i){
$startPos = $i;
$startByte = $count;
}
if(($count-$startByte) >= $length) {
$endPos = $i;
break;
}
$value = ord($str[$i]);
if($value > 127){
$count++;
if($value>=192 && $value<=223) $i++;
elseif($value>=224 && $value<=239) $i = $i + 2;
elseif($value>=240 && $value<=247) $i = $i + 3;
elsereturn self::raiseError("\"$str\" Not a UTF-8 compatible string", 0, __CLASS__, __METHOD__, __FILE__, __LINE__);
}
$count++;
}
if($type==1 && ($endPos-6)>$length){
returnsubstr($str, $startPos, $endPos-$startPos);
}
else{
returnsubstr($str, $startPos, $endPos-$startPos);
}
}
?>