php 截取utf8 无乱码

</pre><pre name="code" class="php">$str = '中华人aaaa民共b和国,万c岁';
/*
$str 是待截取的字符串
$len 是截取的字符数
*/
function utf8sub($str,$len) {
    if($len <= 0) {
        return '';
    }
    $length = strlen($str); //待截取的字符串字节数
    $offset = 0; // 这是截取高位字节时的偏移量
    $count = 0; 
    $chars = 0;  // 这是截取到的字符数
    $res = '';   // 这是截取的字符串
    while($chars < $len && $offset < $length) { 
        $high = ord(substr($str,$offset,1)); // 重要突破,已经能够判断高位字节
        if(($high & 128 )<128) { //ascii 最大对应值
            // 截取1个字节
            $count = 1;
        } else if(($high & 224 )==192){        
            // 截取2个字节
            $count = 2;
        } else if(($high & 240 )==224) {
            // 截取3个字节
            $count = 3;
        } else if(($high & 248 )==240) {
            // 截取4个字节
            $count = 4;
        }  else if(($high & 252 )==248) {
            // 截取5个字节
            $count = 5;
        }  else if(($high & 255 )==252) {
            // 截取6个字节
            $count = 6;
        } 
        $res .= substr($str,$offset,$count);
        $chars += 1;
        $offset += $count;
    }
    return $res;
}
echo utf8sub($str,5),'<br>';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值