function  csubstr($string,$start,$length)        
       {  
               $str="";  
               $len=$start+$length;  
               for($i=$start;$i<$len;$i++){  
                       if(ord(substr($string,$i,1))>0xa0){        
                               $str.=substr($string,$i,2);        
                               $i++;        
                       }        
                       else          
                               $str.=substr($string,$i,1);  
               }                    
                         
               return  $str;                
       }  看看这个好不好用,别人写的

解决方案 »

  1.   

    function substrGB($string,$start,$len)
    {
    for($i=0;$i<$start+$len;$i++)
    {
    $tmpstr=(ord($string[$i])>=161 && ord($string[$i])<=247 && ord($string[$i+1])>=161 && ord($string[$i+1])<=254)?$string[$i].$string[++$i]:$tmpstr=$string[$i];
    if ($i>=$start&&$i<($start+$len))$tmp .=$tmpstr;
    }
    return $tmp;
    }
      

  2.   

    //$str 要截取的字符串
      //$start 从第$start个字符开始截取,一般取 0
      //$len 截取长度
      function CsubStr($str,$start,$len)
      {
               $strlen=strlen($str);
               $clen=0;
               for($i=0;$i<$strlen;$i++,$clen++)
               {
                   if ($clen>=$start+$len)
                   {
                       $tmpstr.="..";
                       break;
                   }
                   if(ord(substr($str,$i,1))>0xa0)
                   {
                      if ($clen>=$start)
                      $tmpstr.=substr($str,$i,2);
                      $i++;
                   }
                   else
                   {
                       if ($clen>=$start)
                       $tmpstr.=substr($str,$i,1);
                   }
               }
               return $tmpstr;
      }
    不好意思,我也是找过来用的。
      

  3.   

    http://www.dev-club.com/club/bbs/showEssence.asp?id=15340
      

  4.   

    $vsmystr=ABabySubstr('我是ABabyStudio,请多多指教!',4);
    echo($vsmystr.'<br/>');function ABabySubstr($vsstr_,$vilen_){
    $vsreturn='';
    $viindex=0;
    $vitmp=0;
    $vstmp='';
    $vicncharaterend=0;
    $vscharacter=substr($vsstr_,$viindex,1);
    $vsrealcharacter=substr($vsstr_,$viindex,1);
    while(strlen($vsrealcharacter)){
    $viindex++;
    if(ord($vscharacter)<0 || ord($vscharacter)>127){
    if($vicncharaterend==0){
    $vicncharaterend=1;
    }
    else{
    $vitmp++;
    $vicncharaterend=0;
    }
    }
    else{
    $vitmp++;
    }
    $vstmp=$vstmp.$vscharacter;
    if($vitmp==$vilen_){
    $vsreturn=$vstmp;
                break;
    }
    if(!strlen(substr($vsstr_,$viindex,1))){
    $vsreturn=$vstmp;
    break;
    }
    $vscharacter=substr($vsstr_,$viindex,1);
    $vsrealcharacter=substr($vsstr_,$viindex,1);
    }
    return($vsreturn);
    }
      

  5.   

    改进了一点
    ---------------
    $vsmystr=ABabySubstr('我是ABabyStudio,请多多指教!',1,14);
    echo($vsmystr.'<br/>');function ABabySubstr($vsstr_,$vistart_,$vilen_){
    $vsreturn='';
    $viindex=0;
    $vitmp=0;
    $vstmp='';
    $vicncharaterend=0;
    $vscharacter=substr($vsstr_,$viindex,1);
    $vsrealcharacter=substr($vsstr_,$viindex,1);
    while(strlen($vsrealcharacter)){
    $viindex++;
    if(ord($vscharacter)<0 || ord($vscharacter)>127){
    if($vicncharaterend==0){
    $vicncharaterend=1;
    }
    else{
    $vitmp++;
    $vicncharaterend=0;
    }
    }
    else{
    $vitmp++;
    }
    if($vitmp>$vistart_ || ($vitmp==$vistart_ && $vicncharaterend==1)){
    $vstmp=$vstmp.$vscharacter;
    if($vitmp-$vistart_==$vilen_){
    $vsreturn=$vstmp;
    break;
    }
    if(!strlen(substr($vsstr_,$viindex,1))){
    $vsreturn=$vstmp;
    break;
    }
    }
    $vscharacter=substr($vsstr_,$viindex,1);
    $vsrealcharacter=substr($vsstr_,$viindex,1);
    }
    return($vsreturn);
    }