gbk与utf-8字符串无乱码截取

GBK:


 
 
  1. <?php

  2. function mysubstr($str$start$len) {

  3. $tmpstr = "";

  4. $strlen = $start + $len;

  5. for($i = 0; $i < $strlen$i++) {

  6. if(ord(substr($str$i, 1)) > 0xa0) {

  7. $tmpstr .= substr($str$i, 2);

  8. $i++;

  9.        } else

  10. $tmpstr .= substr($str$i, 1);

  11.    }

  12. return$tmpstr;

  13. }

  14. ?>


今天发现(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:


 
 
  1. <?php

  2. function utfSubstr($str$position$length,$type=1){

  3. $startPos = strlen($str);

  4. $startByte = 0;

  5. $endPos = strlen($str);

  6. $count = 0;

  7. for($i=0; $i<strlen($str); $i++){

  8. if($count>=$position && $startPos>$i){

  9. $startPos = $i;

  10. $startByte = $count;

  11.   }

  12. if(($count-$startByte) >= $length) {

  13. $endPos = $i;

  14. break;

  15.   }

  16. $value = ord($str[$i]);

  17. if($value > 127){

  18. $count++;

  19. if($value>=192 && $value<=223) $i++;

  20. elseif($value>=224 && $value<=239) $i = $i + 2;

  21. elseif($value>=240 && $value<=247) $i = $i + 3;

  22. elsereturn self::raiseError("\"$str\" Not a UTF-8 compatible string", 0, __CLASS____METHOD____FILE____LINE__);

  23.   }

  24. $count++;

  25.  }

  26. if($type==1 && ($endPos-6)>$length){

  27. returnsubstr($str$startPos$endPos-$startPos);

  28.  }

  29. else{

  30. returnsubstr($str$startPos$endPos-$startPos);      

  31.  }

  32. }

  33. ?>




      本文转自许琴 51CTO博客,原文链接:http://blog.51cto.com/xuqin/882328,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值