这是因为汉字全角半角的问题,给你个函数:
function ChgTitle($title,$length){ 
   if($length!=0){
   
   if (strlen($title)>$length) { 
    $temp = 0; 
    for($i=0; $i<$length; $i++) 
    if (ord($title[$i]) > 128) 
      $temp++; 
     if ($temp%2 == 0) 
       $title = substr($title,0,$length)."..."; 
     else 
     $title = substr($title,0,$length+1)."..."; 
    } 
    return $title; 
   
   }else{return $title;}
   
   }

解决方案 »

  1.   

    function ChgTitle($title,$length){ 
       if($length!=0){
       
       if (strlen($title)>$length) { 
        $temp = 0; 
        for($i=0; $i<$length; $i++) 
        if (ord($title[$i]) > 128) 
          $temp++; 
         if ($temp%2 == 0) 
           $title = substr($title,0,$length).chr(0)."..."; 
         else 
         $title = substr($title,0,$length+1).chr(0)."..."; 
        } 
        return $title; 
       
       }else{return $title;}
       
       } 
    //使用例子:
    $aaa="在我记忆的脑海里,一份独特的珍藏,一份思念的眷恋,将是我生命历程的永远回味。十年前的今天我美好幸福的人生旅途瞬间画上了句号。我由一个娇媚的少妇,变成一名独自面对一切的坚强女人,成熟女人,肩负着重大责任的女人。是人生的坎坷让我脱胎换骨。   十年前的今天,也是一双休日,天很冷,你清晨就悄悄挪出温暖的被窝。做为电视新闻工作者的你,每次的双休日很少休息,为了全市人民能看上好的电视节目,你辛勤的努力着,流下很多的汗水,直到你永远离开我后,才在你的办公桌里看到你曾经受到省,地,市级各种奖励证书三十余本。我知道你是干事业的男人
    ";
    trim($aaa);
    $result=ChgTitle($aaa,40);//取40个字符,既20个汉字
    echo $result;
      

  2.   

    刚写的,试试啊.
    function GetLocalSubstr($strSourceString, $intLong = -1, $charset="GB2312")
    {
    $strLenth = mb_strlen($strSourceString, $charset);
    if($intLong == -1)
    {
    return $strSourceString
    }
    $intMaxCharLenth = 0;
    for ($i = 0; $i < $strLenth; $i++)
    {
    $intMaxCharLenth = $intMaxCharLenth + strlen(mb_substr($strSourceString, $i, 1, $charset));
    }
    if($intLong < 0 || $intLong > $intMaxCharLenth)
    {
    return "";
    }
    $arrString = array();
    $intCharLenth = 0;
    $intDstPos = 0;
    for ($i = 0; $i < $strLenth; $i++)
    {
    $arrString[$i] = mb_substr($strSourceString, $i, 1, $charset); if ($arrStringLenth[$i] == 1)
    {
    $intCharLenth = $intCharLenth + 1;
    }
    else
    {
    $intCharLenth = $intCharLenth + 2;
    }
    if($intCharLenth > $intLong)
    {
    $intDstPos = $i - 1;
    break;
    }
    }
    $strReturnValue = "";
    for ($i = 0; $i <= $intDstPos; $i++)
    {
    $strReturnValue = $strReturnValue . mb_substr($strSourceString, $i, 1, $charset);
    }
    return $strReturnValue;
    }
      

  3.   

    function 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;
    }
      

  4.   

    1、首先上面的示例得
    在我记忆的脑海里,一份独特的珍藏,一份思...
    2、其实
    echo substr($aaa,0,40);
    就是
    在我记忆的脑海里,一份独特的珍藏,一份思
      

  5.   

    TO:xuzuning(唠叨) 
    我的那个函数是为了在汉字字符串<=指定长度的时候正常显示,超过的部分用...代替
      

  6.   

    http://xjtusky.net/article/htmldata/2004_11/3/58/article_973_1.html
      

  7.   

    我用的比较好用。比那个一个字符一个字符比较的好用,那个一个字符一个字符比较的单字节的字也之算1。function c_substr($str,$start=0)
    {
    //一个汉字为2
      $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)
    {
    //一个汉字为1
      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));
    }function m_strlen($str)
    {
      preg_match_all("/[\x80-\xff]?./",$str,$ar);
      return count($ar[0]);
    }