PHP中文无乱码截取

正在上传文件反正无聊 就把php无乱码截取写出来吧`

参数说明

    gbk    字符编码中,存储中文字符要2个字节

    uft-8  字符编码中,存储中文字符要3个字节

    0xa0  半个汉字

    ord()— 返回字符的 ASCII 码值

    chr() — 返回指定的字符


 

在网上我也看到一些截取中文的函数 但是我认为他们是有缺陷的 如不能区别utf-8  gbk的字符集 中文 于是我自己写了一个

但是我却发现我写的函数其实是用mb系列函数 ,我也是廋少不了

header("content-type:text/html; charset = gbk");
    function chinesesubstr($str,$star,$len,$char_set='uft8'){
        $tmpstr = null;
        $char_set=='gbk'?$char_set=2:$char_set=3; //根据不同的字符集 来截取不同的长度
        $strlen = $star+$len;
        for( $i=0;$i<$strlen;$i++ ){
            if(ord(substr($str,$i,1))>0xa0){
                 $tmpstr .= substr($str,$i,$char_set);
                 $i++;
            }else{
                 $tmpstr .= substr($str,$i,1);
            }
        }
        return $tmpstr;
    }
//中文(中文特殊符号->有一些事不区分中英的#%*等):3 数字:1 字母(特殊符号):1 
echo chinesesubstr('玩儿qqq额外人听闻',0,5,'gbk');

所以还是老老实实的写一个mb系列的函数吧

function chinesesubstr($str,$star=0,$len,$encoding ='utf8'){
    $strlen = mb_strlen($str, $encoding); 
    if($strlen < $len){
        return $str;
    }else{
        $re_turn = mb_substr($str,$star,$len,$encoding).chr(0).'...';
        return $re_turn;
    } 
}
$str = "这个新闻或是文章的标题很长,需要只显示前面一些字,后面用...来代替";
echo chinesesubstr($str,0,5);

知识点终结

当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,

这就是出现乱码的原因。而值为0x81到0xff与0x00组合始终都显示为“空” 根据这一特点,

在substr的结果后面补上一个chr(0),就可以防止出现乱码了

chr(0)相关知识: 
null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000  
虽然chr(0)不会显示出什么,但是他是一个字符。

 

posted @ 2015-04-17 20:24  IT树  阅读(321)  评论(0编辑  收藏  举报