$str="精美!海豚里的世界屏保";
$substr=substr($str,0,12);
echo $substr;

解决方案 »

  1.   

    补充说明: 字符串的内容是从数据库取的,截取时是不知道内容的,
    $str="精美!海豚里的世界屏保"  只是举的例子.
      

  2.   

    试试这个吧。把$str和12作参数传入调用方法:
    $substr=get_valid_q($str,12);
    //取汉字函数,防止取半个字符
      function get_valid_q($q,$length){
       if(strlen($q)<=$length) return $q;
       else {
      $temp=0;
      for($i=0; $i<$length; $i++){
       if (ord($q[$i]) > 128)
       $temp++;
      }
      if ($temp%2 ==0) $q = substr($q,0,$length);
      else $q = substr($q,0,$length+1);
      return $q;
       }
      }
      

  3.   

    change substr to mb_substr
      

  4.   

    可以用iconv进行编码之间的转换,还有mbstring或者升级到PHP5(直接支持中文字符)
      

  5.   

    自编的substr函数不止一个啊,拿来用吧,解决汉字切断问题
    两个高效的函数:c_substr、m_substr。他们的用法完全与substr和mb_substr相同。不同之处在于:c_substr按字节计算,即一个汉字的长度为2;m_substr按字计算,即一个汉字的长度为1。可根据需要选用。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);
    }function m_substr($str,$start) {
      preg_match_all("/[\x80-\xff]?./",$str,$ar);
      if(func_num_args() >= 3) {
        $end = func_get_arg(2);
        return join("",array_slice($ar[0],$start,$end));
      }else
        return join("",array_slice($ar[0],$start));
    }
      

  6.   

    看你问个问题非要把substr()写成strlen()!
      

  7.   

    string mb_substr ( string str, int start [, int length [, string encoding]] )
    参数:要截取的字符串,开始位置,长度(可省略),编码(可省略)mb_substr() returns the portion of str specified by the start and length parameters. 
      

  8.   

    如果mysql是4.1以上,设置了character set为gb2312或utf8的话,直接 
    select left(title,4) from ....
    这样就可以截取4个字符(包括中文和英文,一个中文作为一个字符计算)
      

  9.   

    function jiequ($string, $length = 80, $etc = '...',
                                      $break_words = false, $middle = false)
    {
        if ($length == 0)
            return '';    if (strlen($string) > $length) {
            $length -= strlen($etc);
            if (!$break_words && !$middle) {
                $string = preg_replace('/\s+?(\S+)?$/', '', substr($string, 0, $length+1));
            }
            if(!$middle) {
                return substr($string, 0, $length).$etc;
            } else {
                return substr($string, 0, $length/2) . $etc . substr($string, -$length/2);
            }
        } else {
            return $string;
        }
    }具体使用,自己改一下,我一直用的函数。
      

  10.   

    $str="精美!海豚里的世界屏保";
    echo substrs($str,12);function substrs($content,$length) {
    if($length && strlen($content)>$length){
    $num=0;
    for($i=0;$i<$length-3;$i++) {
    if(ord($content[$i])>127){
    $num++;
    }
    }
    $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3);
    $content.='..';
    }
    return $content;
    }
      

  11.   


    chaoliu1(潮流) ( ) 信誉:100    Blog 的方法已经可以了
      

  12.   

    下面是一个中文版的substr函数function getsubstring($str,$len) 

        for($i = 0;$i <$end;$i++) 
        { 
            if ($i >=0 AND $i <$end) 
            { 
                if(ord(substr($str,$i,1)) > 0xa1)  
                    $result_str.=substr($str,$i,2); 
                else 
                    $result_str.=substr($str,$i,1); 
            } 
            if(ord(substr($str,$i,1)) > 0xa1) 
                $i++; 
        } 
        if(strlen($str)<=$end) 
            return $result_str; 
        else 
            return $result_str."..."; 
    }
      

  13.   

    你的php版本是多少啊?
    从去年开始,substr函数已经很久没出现过截取中文乱码问题了,不过条件是从0开始,如:
    substr($str,0,13);
    不过你的程序好象是从0开始的,那么要检查一下你的php版本了,php5没问题
      

  14.   

    不好意思,收回上面我的话,用
    substr($str,0,13).chr(0);
    有个缺点:用chr(0)截取的页面,在ajax文件中调用时会有问题
      

  15.   

    /*
         * Code By 唠叨
         *
         * 根据 唠叨老大 以前发在CSDN的代码添加了点点东西
         * @todo 中文截取,支持gb2312,gbk,utf-8,big5 
         *
         * @param string    $str                            要截取的字串
         * @param int        $start                            截取起始位置
         * @param int        $length                            截取长度
         * @param string    $charset utf-8|gb2312|gbk|big5    编码
         * @param $suffix    是否加尾缀
         *
         */
        function CsubStr($str, $start=0, $length=20, $suffix='', $charset="utf-8")
        {        if(@function_exists("mb_substr"))
            {
                $slice    = @mb_substr($str, $start, $length, $charset);
                if( mb_strlen($str,$charset) > $start+$length )$slice.=$suffix;
                Return $slice;
            }        $re['utf-8']    = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
            //简化后为
            //$re['utf-8']    = "/[\x00-\x7f]|[\xc0-\xff][\x80-\xbf]+/";
            $re['gb2312']    = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
            $re['gbk']        = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
            $re['big5']        = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";        preg_match_all($re[$charset], $str, $match);
            $slice            = @join("",array_slice($match[0], $start, $length));        if( strlen($str) > $start+$length )$slice.=$suffix;        Return $slice;
        }//End Function
      

  16.   

    看看下面的收藏
    http://space.xzcn.com/1000006/blog/show/fae0b27c451c728867a567e8c1bb4e53.html