登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无所谓了嘛

珍惜现在,放眼未来

 
 
 

日志

 
 
 
 

PHP中中文按实际字符截取字符串  

2012-11-05 11:50:36|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
      由于字符编码的问题在几乎所有语言中的字符串截取都会根据不同的编码进行相应的修改,在PHP中对中文截取时(UTF8编码),中文是按3个字节存储的,所以对中文截取不能使用随便substr函数进行截取,比如:
echo substr('一二三四',0 ,3);//输出:一,而不是输出:一二三
为了能截取字符串时把汉字当一个字符使用的PHP的API里没有提供相应的函数,经过改写discuz的cutstr函数可以实现我们需求,函数如下:
function cn_cutstr($string, $length, $dot = '...', $charset = 'utf-8'){
    if(strlen($string) <= $length) {
        return $string;
    }
    $pre = chr(1);
    $end = chr(1);
    $string = str_replace(array('&amp;', '&quot;', '&lt;', '&gt;'), array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), $string);
    $strcut = '';
    if(strtolower($charset) == 'utf-8') {
        $n = $tn = $noc = 0;
        while($n < strlen($string)) {
            $t = ord($string[$n]);
            if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                $tn = 1; $n++; $noc++;
            } elseif(194 <= $t && $t <= 223) {
                $tn = 2; $n += 2; $noc += 2; $length ++;
            } elseif(224 <= $t && $t <= 239) {
                $tn = 3; $n += 3; $noc += 2; $length ++;
            } elseif(240 <= $t && $t <= 247) {
                $tn = 4; $n += 4; $noc += 2; $length ++;
            } elseif(248 <= $t && $t <= 251) {
                $tn = 5; $n += 5; $noc += 2; $length ++;
            } elseif($t == 252 || $t == 253) {
                $tn = 6; $n += 6; $noc += 2; $length ++;
            } else {
                $n++;
            }
            if($noc >= $length) {
                break;
            }
        }
        if($noc > $length) {
            $n -= $tn;
        }
        $strcut = substr($string, 0, $n);

    } else {
        for($i = 0; $i < $length; $i++) {
            $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
        }
    }
    $strcut = str_replace(array($pre.'&'.$end, $pre.'"'.$end, $pre.'<'.$end, $pre.'>'.$end), array('&amp;', '&quot;', '&lt;', '&gt;'), $strcut);
    $pos = strrpos($strcut, chr(1));
    if($pos !== false) {
        $strcut = substr($strcut,0,$pos);
    }
    return $strcut.$dot;
}
  评论这张
 
阅读(293)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018