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);
-
}
-
}
-
?>