/* 
功能:截取全角和半角混合的字符串以避免乱码 
参数: 
$str_cut 需要截断的字符串 
$length  允许字符串显示的最大长度 */ function substr_cut($str_cut,$length = 30){  if (strlen($str_cut) > $length){ 
  for($i=0; $i < $length; $i++) 
   if (ord($str_cut[$i]) > 128) $i++; 
  $str_cut = substr($str_cut,0,$i) . "..."; 

return $str_cut; 

解决方案 »

  1.   

    直接sql里就可以截取,sql4.1以上设置charset后无半个中文问题
      

  2.   

    public String getSubstring(String str,int length)
        {
            String substr="";
            if(str == null || str.equals(""))
            {
                str="Error";
            }
            
            if(str.length() > length)
            {
                substr=str.substring(0,length);
                substr+=".....";
            }
            else
            {
                substr=str;
            }
            
            return substr;
        }
      

  3.   

    这个用css实现比较好,用php也可以实现:
    <div style="text-overflow:ellipsis">content</div>用php也能处理,这是唠叨写的:$len = 19;$text = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?";echo strlen($text)<=$len ? $text : (substr($text,0,$len).chr(0)."....");
     
    chr(0)不是null
    null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000
    虽然chr(0)不会显示出什么,但是他是一个字符。
    当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空”
    根据这一特点,在substr的结果后面补上一个chr(0),就可以防止出现乱码了
    注:
    编码 第一字节 第二字节
    gb2312 0xa1-0xf7 0xa1-0xfe
    gbk 0x81-0xfe 0x81-0xfe 0x40-0x7e
    big5 0xa1-0xf7 0x81-0xfe 0x40-0x7e
    其次这个是网上搜索的,支持utf-8编码,原作者不详:
     
         function subString_UTF8($str, $start, $lenth)
        {
            $len = strlen($str);
            $r = array();
            $n = 0;
            $m = 0;
            for($i = 0; $i < $len; $i++) {
                $x = substr($str, $i, 1);
                $a  = base_convert(ord($x), 10, 2);
                $a = substr('00000000'.$a, -8);
                if ($n < $start){
                    if (substr($a, 0, 1) == 0) {
                    }elseif (substr($a, 0, 3) == 110) {
                        $i += 1;
                    }elseif (substr($a, 0, 4) == 1110) {
                        $i += 2;
                    }
                    $n++;
                }else{
                    if (substr($a, 0, 1) == 0) {
                        $r[ ] = substr($str, $i, 1);
                    }elseif (substr($a, 0, 3) == 110) {
                        $r[ ] = substr($str, $i, 2);
                        $i += 1;
                    }elseif (substr($a, 0, 4) == 1110) {
                        $r[ ] = substr($str, $i, 3);
                        $i += 2;
                    }else{
                        $r[ ] = '';
                    }
                    if (++$m >= $lenth){
                        break;
                    }
                }
            }
            return $r;
        } // End subString_UTF8;
    }// End String#由于此函数返回的是一个数组,因此要配合join函数来显示字符串:
    #join('',subString_UTF8($str, $start, $lenth));
    #在页面显示的时候还可以在此语句后面连一个"..."