//-----------------------中文字符串截取---------------- 
// $str:  字符串
// $start:开始截取位置
// $length:截取长度
  function getSubstr($str,$start,$length) 
  {   
     $strlen=strlen($str); 
     if (($start>=$strlen) or ($length >= $strlen))
        return $str; 
     $clen=0; 
     for($i=0;$i<$strlen;$i++,$clen++)   
     {        
        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); 
          } 
         if ($clen>=$start+$length) 
       break; 
    }   
     return $tmpstr."...?";   
  } 
//---------------End 中文字符串截取----------------------------------

解决方案 »

  1.   

    如何用了 gb2312字符集,字符串长度计算一个字母与一个中文字是同长度。
    select left(col1,20) from test
    就是20个中文或字母了要是想20个字节,就不能如凉开水兄所说的,判断最后字节是否中文再截取就行了
      

  2.   

    /**********************************************************************
      语法: string substr_for_gb2312(string string, int start, int [length]);
      返回值: 字符串
      用法同substr();
      本函数将字符串 string 的第 start 位起的字符串取出 length 个字符。
      若 start 为负数,则从字符串尾端算起。
      若可省略的参数 length 存在,但为负数,则表示取到倒数第 length 个字符.
    ***********************************************************************/
    //原理:国标码的编码机内码为161到255,即A0到FFfunction substr_for_gb2312($str,$start,$len=Null){
        $totlelength = strlen($str);    //特例情况
        if ($len == null) $len = $totlelength;
        if ($len ==0) return "";
        if ($len >= $totlelength && $start == 0 ) return $str;
        if ($start > $totlelength) return "";    //分析$start
        if ($start < 0 )//$start<0时,转化为$start>0时的定位.
        {
            if ( abs($start) >= $totlelength ) $start = 0;
            else $start = $totlelength - abs($start);
         }
        //确定起始位置,当起始位拆分某汉字时,返回值包含此汉字.
        if ($start > 0)
        {
            $i = $start-1;        $flag = -1;        while ($i >= 0)
            {
                if ( ord(substr($str,$i,1)) > 160)
                {
                   $flag = -1*$flag;
                }
                else break;
                $i--;
            }
            if($flag==1)
            {
                $start = $start - 1;
                $len++;  //保证不位移.
            }
        }    $str = substr($str,$start);//截除字符串$str的$start位前的字符
        $totlelength = strlen($str);    //确定结束位置,当结束位拆分某汉字时,返回值不包含此汉字.
        if ($len<0) $len = $totlelength - abs($len);
        if ($len <= 0) return "";
        $i=min($len,$totlelength);
        $i--;
        $flag = -1;
        while ($i >= 0){
            if (ord(substr($str,$i,1))>160){
                $flag=-1*$flag;
            }else break;
            $i--;
        }
        if($flag == 1)$len=$len-1;
        $subit=substr($str,0,$len);
        return $subit;
    }
      

  3.   

    $str = "xxxxxxxxxxxxx";
    $str = strlen($str)<=20?$str:substr($str,0,20).chr(0)."...";