对于一般情况,这样就行了function csubstr($str,$len) 

   $engword = 0;
   for($i=0;$i<$len;$i++){
      $c = substr($str,$i,1);
      if(ord($c)<127) $engword++;
   }
   if($engword%2==1){ //英文数为奇数
       if($len%2==1) $str = substr($str,0,$len);
       else $str = substr($str,0,$len-1);
   }
   else{//英文数为双数
       if($len%2==1) $str = substr($str,0,$len-1);
       else $str = substr($str,0,$len);
   }
   return $str; 
}有的人在ord($c)<127

ord($c)<0xa0
不过我用前者不曾出现任何错误,所以.....

解决方案 »

  1.   

    挺好!
    CSDN 上有很多这方面的旧贴!
      

  2.   

    substr($string,0,500).chr(0);
    一般的这种文字截取是为了做提示性的内容,所以最后一个字符是否有效并不重要。
    加上chr(0)的原因是若最后一个字符若是被截断的全角字,则用其补空。不是加上也没有影响。如需想确切的知道,可用ddboy(呀) 的方法。有意义的截取应截取到段末或句尾。
      

  3.   

    如果你能使用mb_string库的话就用mb_substr函数注意他是按字而不是按字节计算的否则只有自己写一个函数了,很容易的。
    参照ddboy(呀)的方法