网络编程 
首页 > 网络编程 > 浏览文章

PHP 字符串编码截取函数(兼容utf-8和gb2312)

(编辑:jimmy 日期: 2024/11/19 浏览:3 次 )
复制代码 代码如下:
//截取字符串长度。支持utf-8和gb2312编码。若为gb2312,先将其转为utf-8,在utf-8的基础上截取然后再转换回来
function cut_string($str,$from=1,$length=10,$code='utf-8',$rear='...'){
    if($code!='utf-8'){//总是将字符串转为utf-8编码
        $str=iconv($code,'utf-8',$str);
    }
    $str_len=mb_strlen($str,'utf-8');//字符串的长度
    if($from>$str_len){//如果截取开始位置大于字符串长度,截取后面$length个
        $from=$str_len-$length+1;
        $from=($from<1?1:$from);
    }
    //兼容ucs-4编码
    $i=0;//字节计数
    $from_i=0;//开始截取的字节位置
    $from_len=0;//开始截取的字符位置
    $tag=true;//标志$from_len是否已经被赋值
    for($temp_len=0;($temp_len-$from_len<$length)||$tag;$temp_len++){
        $byte_code=ord(substr($str,$i,1));//一个字节的编码
        if($temp_len+1==$from){//记录开始截取的开始字节位置
            $from_i=$i;$from_len=$temp_len;$tag=false;
        }
        if($byte_code>=0&&$byte_code<128){//字符是占用几个字节,utf-8是变长编码,根据每个字符的第一个字节可判断出该字符占几个字节
            $i++;
        }
        if($byte_code>191&&$byte_code<224){
            $i+=2;
        }
        if($byte_code>223&&$byte_code<240){
            $i+=3;
        }
        if($byte_code>239&&$byte_code<248){
            $i+=4;
        }
        if($byte_code>248&&$byte_code<252){
            $i+=5;
        }
        if($byte_code>252&&$byte_code<255){
            $i+=6;
        }
    }
    return iconv('utf-8',$code,substr($str,$from_i,$i-$from_i).$rear);
}
上一篇:php 木马的分析(加密破解)
下一篇:apache2.2.4+mysql5.0.77+php5.2.8安装精简
一句话新闻
一文看懂荣耀MagicBook Pro 16
荣耀猎人回归!七大亮点看懂不只是轻薄本,更是游戏本的MagicBook Pro 16.
人们对于笔记本电脑有一个固有印象:要么轻薄但性能一般,要么性能强劲但笨重臃肿。然而,今年荣耀新推出的MagicBook Pro 16刷新了人们的认知——发布会上,荣耀宣布猎人游戏本正式回归,称其继承了荣耀 HUNTER 基因,并自信地为其打出“轻薄本,更是游戏本”的口号。
众所周知,寻求轻薄本的用户普遍更看重便携性、外观造型、静谧性和打字办公等用机体验,而寻求游戏本的用户则普遍更看重硬件配置、性能释放等硬核指标。把两个看似难以相干的产品融合到一起,我们不禁对它产生了强烈的好奇:作为代表荣耀猎人游戏本的跨界新物种,它究竟做了哪些平衡以兼顾不同人群的各类需求呢?