Chinaunix

标题: 谁有截取中文字符串的函数 [打印本页]

作者: redor    时间: 2004-11-29 14:37
标题: 谁有截取中文字符串的函数
想从很长的字符串中截取一部份但是不能出现乱码的函数,我用过string_cut 但是有时候截取的位空!
作者: redor    时间: 2004-11-29 15:13
标题: 谁有截取中文字符串的函数
自己刚才看了一个文档,初步写了一个如果有需要的可以改一改,嘿嘿
#cut string
#截取字符数
function string_cut($string,$length = 100){
    if (strlen($string)<= $length){return $string;}
        $j=0;
        #get cut position
        #根据所过字符长度确定最后字符的位置
        $pos=$length-1;
        #char of cut pos  is not chinese
        #截取位置字符非汉字
        if($string{$pos}<=12{$cut_string=substr($string,0,$length);}
        #check chinese number total
        #检查中文字符的字节数
        for($i=0; $i < $length; $i++){
            if (ord($string{$i}) >; 12{$j++;}
        }
        #the bytes number of  chinese char is even
        #中文字符字节数为偶数
        if(!($j%2)){
            $cut_string=substr($string,0,$length);
        }else{
            $cut_string=substr($string,0,$length-1);
        }
    return $cut_string."...";
}
作者: redor    时间: 2004-11-29 15:14
标题: 谁有截取中文字符串的函数
排版怎么那么难看了?
作者: HonestQiao    时间: 2004-11-29 22:32
标题: 谁有截取中文字符串的函数
这个是标准的函数:

  1. function Short_Text($title,$titlelen=20)
  2. {
  3.    $len = strlen($title);

  4.    if ($len <= $titlelen):
  5.      $title = $title;
  6.    else:
  7.      $title = substr($title,"0","$titlelen");
  8.      $parity= 0;
  9.      for($i=0;$i<$titlelen;$i++){
  10.         $temp_str=substr($title,$i,1);
  11.         if(Ord($temp_str)>;127) $parity+=1;
  12.      }
  13.      if($parity%2==1) $title=substr($title,0,($titlelen-1))."...";
  14.      else $title=substr($title,0,$titlelen)."...";
  15.    endif;
  16.    return $title;
  17. }
复制代码

作者: redor    时间: 2004-11-30 09:01
标题: 谁有截取中文字符串的函数
原理都一样的
作者: 深空    时间: 2004-11-30 20:28
标题: 谁有截取中文字符串的函数
楼上的,那不叫标准。下面这个,唠叨写的,用法和substr一样:

  1.     function c_substr($str, $start = 0) {
  2.         $ch = chr(127);
  3.         $p = array("/[\x81-\xfe]([\x81-\xfe]|[\x40-\xfe])/", "/[\x01-\x77]/");
  4.         $r = array("", "");
  5.         if(func_num_args() >; 2)
  6.             $end = func_get_arg(2);
  7.         else
  8.             $end = strlen($str);
  9.         if($start < 0)
  10.             $start += $end;
  11.    
  12.         if($start >; 0) {
  13.             $s = substr($str,0,$start);
  14.             if($s[strlen($s)-1] >; $ch) {
  15.                 $s = preg_replace($p,$r,$s);
  16.                 $start += strlen($s);
  17.             }
  18.         }
  19.         $s = substr($str,$start,$end);
  20.         $end = strlen($s);
  21.         if($s[$end-1] >; $ch) {
  22.             $s = preg_replace($p,$r,$s);
  23.             $end += strlen($s);
  24.         }
  25.         return substr($str, $start, $end);
  26.     }
复制代码

作者: chlinux    时间: 2004-11-30 23:58
标题: 谁有截取中文字符串的函数
不错,PHP系统自带一个函数,用来截取各种字符集的字符串的,不过用起来不是很稳定,
作者: childsix    时间: 2004-12-16 10:28
标题: 谁有截取中文字符串的函数
我现在贴出 C++, perl, php的代码
查看我的blog, 总有一个适合你 : http://spaces.msn.com/members/childsix/Blog/cns!1pHhQNB9Y2fuMDKLccsb_05g!139.entry
作者: cbrooks    时间: 2004-12-17 02:19
标题: 谁有截取中文字符串的函数
哪个都行了,只要能实现功能就行了!!!!!!!
作者: Rogman    时间: 2005-11-17 00:51
对GBK字符集的处理,以上方法是没有问题。

但是对UTF-8字符集的处理呢?以上方法就不行了。
作者: wobushiwo    时间: 2005-11-17 01:18
当一位的编码的范围超过某一范围就并字节处理撒
可以去参考unicode的utf-8,16,32如何定义撒
作者: HonestQiao    时间: 2005-11-17 10:33
原帖由 wobushiwo 于 2005-11-17 01:18 发表
当一位的编码的范围超过某一范围就并字节处理撒
可以去参考unicode的utf-8,16,32如何定义撒



看看我用正则写的那一个
作者: swingcoder    时间: 2005-11-17 14:08
难道没有人用过mbstring,可惜了一个好东东。
作者: jy_nim    时间: 2005-11-17 16:15
原帖由 swingcoder 于 2005-11-17 14:08 发表
难道没有人用过mbstring,可惜了一个好东东。

mb_strimwidth()这个函数吧,用UTF-8编码美问题,用GB2312也会出问题的
作者: ilex    时间: 2009-01-31 12:32
我来挖一下坟。


不知道有人了解source insight里面的 宏  没?

请问,source insight里面有没有判断汉字的功能,
功能:第79列是汉字 还是 非汉字;

谢谢;
作者: liuxingyuyuni    时间: 2009-01-31 18:55
标题: 两个都测试没有通过
乔和深空的会出现乱码状况,我还是老老实实MB方法吧
作者: rains    时间: 2009-02-01 15:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: ddvv    时间: 2009-02-03 17:45
标题: 网上找的~

  1. function utf8Substr($str, $from, $len)
  2. {
  3.     return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
  4.                        '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
  5.                        '$1',$str);
  6. }

  7. function gb2312Substr($str, $start, $len) {
  8.     $tmpstr = "";
  9.     $strlen = $start + $len;
  10.     for($i = 0; $i < $strlen; $i++) {
  11.         if(ord(substr($str, $i, 1)) > 0xa0) {
  12.             $tmpstr .= substr($str, $i, 2);
  13.             $i++;
  14.         } else
  15.             $tmpstr .= substr($str, $i, 1);
  16.     }
  17.     return $tmpstr;
  18. }

复制代码

作者: vikie    时间: 2009-02-04 10:19
贴一个我自己写的,功能跟lz要求的有点小小的差别
function cutoff($str,$num,$extra='...')
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (function_exists('mb_strlen'))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mb_strlen($str,'utf-8')>$num)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return mb_substr($str,0,$num,'utf-8').$extra;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop=0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for ($i=0;$i<strlen($str);$i++)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$loop++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($loop>$num)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return substr($str,0,$i).$extra;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ( between(ord(substr($str,$i,1)),192,223) && between(ord(substr($str,$i,1)),128,191) )
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$i++;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elseif ( between(ord(substr($str,$i,1)),224,239) && between(ord(substr($str,$i+1,1)),128,191) && between(ord(substr($str,$i+2,1)),128,191))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$i+=2;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $str;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;function between($num,$mix,$max)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return ($num>=$mix  && $num<=$max)?true:false;
&nbsp;&nbsp;&nbsp;&nbsp;}

作者: yuxiaqiao    时间: 2009-02-08 18:00
项目都是用UTF-8的,所以喜欢
mb_internal_encoding("UTF-8");
mb_substr($rs->fields['article_main_title'],0,14) . '...';
作者: m@qintoshi    时间: 2009-06-05 08:46
php>=4.0.6以后不是就有mb_substr了嘛?只需要自己写个strlen的utf8版本就可了:


  1. FUNCTION utf8_strlen($utf8_str) {

  2.   return preg_match_all('/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/', $utf8_str, $dummy);

  3. }


  4. mb_substr($UTF8_STR, $INT_START, $INT_LEN, $ENCODING);
  5. 然后随便你怎么去弄把

复制代码

[ 本帖最后由 m@qintoshi 于 2009-6-5 09:50 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2