function substr_cn($str, $len, $start = 0) 

    $strlen = strlen($str); 
    for($i = 0; $i < $strlen; $i++) 
    { 
        if($i >= $start && $i < ($start + $len)) 
        { 
            if(ord(substr($str, $i,1)) > 0xa1)
            {
                $tmpstr .= substr($str, $i, 2); 
                $i++;
            }else
                $tmpstr .= substr($str, $i, 1); 
        }     } 
    if(strlen($tmpstr) > $len)
    {
        $len--;
        return substr_cn($str, $len, $start);
    }
    return $tmpstr;
}

解决方案 »

  1.   

    to  julychina(九品代码工) 
    这个函数我知道你的用意啊,就是用于截取中文字符串而使不会截断最后一个中文字而来的。
    但我的意思是假设我已有一个字符串,可能最后一个字已被截断或未截断,我想把如果截断了的就放弃最后一个字的方法。
      

  2.   

    谁能帮俺给这个函数加下注释,或者告诉我这个函数的思路谢谢哦!
    function substr_cn($str, $len, $start = 0) 

        $strlen = strlen($str); 
        for($i = 0; $i < $strlen; $i++) 
        { 
            if($i >= $start && $i < ($start + $len)) 
            { 
                if(ord(substr($str, $i,1)) > 0xa1)
                {
                    $tmpstr .= substr($str, $i, 2); 
                    $i++;
                }else
                    $tmpstr .= substr($str, $i, 1); 
            }     } 
        if(strlen($tmpstr) > $len)
        {
            $len--;
            return substr_cn($str, $len, $start);
        }
        return $tmpstr;
    }
      

  3.   

    function c_substr($str,$start=0) {
      $ch = chr(127);
      $p = array("/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/","/[\x01-\x77]/");
      $r = array("","");
      //func_num_args,func_num_args 可变参数函数列表
      if(func_num_args() > 2)
        $end = func_get_arg(2);
      else
        $end = strlen($str);
      if($start < 0)
        $start += $end;  if($start > 0) {
        $s = substr($str,0,$start);
        if($s[strlen($s)-1] > $ch) {
          $s = preg_replace($p,$r,$s);
        $start += strlen($s);
        }
      }
      $s = substr($str,$start,$end);
      $end = strlen($s);
      if($s[$end-1] > $ch) {
        $s = preg_replace($p,$r,$s);
        $end += strlen($s);
      }
      return substr($str,$start,$end);
    }
      

  4.   

    咳咳,说到这个我又要推荐升级mysql到4.1版本以上了。
    字段的编码设为gbk后,sql语句里使用substr,left等都能自动处理中文。
    比如left( x , 5 ) 是取左边5个字符(包括中文和英文,绝对不会产生半个汉字)
      

  5.   

    按照asc编码格式的话,应该是不能判断
    所以一般,截取汉字的时候,都是第一个字符开始判断的,要是能判断是不是前一位还是后一位,截取汉字的效率,会大幅度提高
      

  6.   

    建议把数据库的编码设置为utf-8,然后在程序中使用mbstring函数来处理。