function c_substr($str,$start=0) {
  $ch = chr(127);
  $p = array("/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/","/[\x01-\x77]/");
  $r = array("","");
  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);
}用法与substr函数一样

解决方案 »

  1.   

    给你一个函数
    function substrgb($str,$start,$len){
        for($i=0;$i<$start+$len;$i++){
            $tmpstr=(ord($str[$i])>=161 && ord($str[$i])<=247&& ord($str[$i+1])>=161 && ord($str[$i+1])<=254)?$str[$i].$str[++$i]:$tmpstr=$str[$i];
            if ($i>=$start&&$i<($start+$len))$tmp .=$tmpstr;
        }
        return $tmp;
    }
    可以去http://www.zg77hk.com/bbs/viewthread.php?tid=9190&fpage=1
    那里看看
      

  2.   

    哈哈 我推荐我的函数:
    function showShort($str, $len)
    {
        if (strlen($str) <= $len)return $str;
        $s = 0;
        $new_str = ""; //初始化状态变量和原始空字串
        for($i = 0;$i < $len-2;$i++) {
            if (ord($str{$i}) > 127)$s++;
            $new_str .= $str{$i};
        } 
        if ($s % 2 == 1)$new_str .= $str{$i};
        return $new_str . "...";
    }
      

  3.   

    谢谢xmj123() 
    你的代码我用了