php解决中英混排字符串截取

当系统的字符存储设置了固定长度。

那存储的字符串如果过长,会造成程序异常或字符串被截断的情况。

如果通过php的系统函数substr()去截取字符串,遇到中文会造成截取异常(乱码字符)的情况。

改用mb_substr()去截取中英文,可以解决截取异常(乱码字符)的情况。

值得注意的是,substr()与mb_substr()的截取长度是有不同。

$str = '大家好-才是真的好';
echo substr($str,0,3);//出现截取异常,截取值:乱码字符
echo mb_substr($str,0,3);//截取正常,截取值:大家好 

而且,现实中系统设置字符的固定长度,通常是以英文字符,每个字符占1位为准的。

然而中文字符的占用是3位长度。

为了解决这个问题,可以判断传入字符串的每个字符在ASCII编码内的区域,根据区域不同位置使用不同的截取长度。

所以,通过自定义函数体去解决这个问题即可。

function common_substr($sourcestr, $cutlength) {
   $returnstr = '';
   $i = 0;
   $n = 0;
   $str_length = strlen ( $sourcestr ); //字符串的字节数 
   while ( ($n < $cutlength) and ($i <= $str_length) ) {
    $temp_str = substr ( $sourcestr, $i, 1 );
    $ascnum = ord ( $temp_str ); //得到字符串中第$i位字符的ascii码 
    if ($ascnum >= 224) {//如果ascii位高与224,
        if($n+3>$cutlength){
            return $returnstr;
        }
        $returnstr = $returnstr . substr ( $sourcestr, $i, 3 ); //根据utf-8编码规范,将3个连续的字符计为单个字符  
        $i = $i + 3; //实际byte计为3
        $n +=3;
        //echo $n."\n";
    } elseif ($ascnum >= 192){ //如果ascii位高与192,
        if( $n+2>$cutlength){
            return $returnstr;
        }
        $returnstr = $returnstr . substr ( $sourcestr, $i, 2 ); //根据utf-8编码规范,将2个连续的字符计为单个字符 
        $i = $i + 2; //实际byte计为2
        $n +=2;
    } elseif ($ascnum >= 65 && $ascnum <= 90) {//如果是大写字母,
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; //实际的byte数仍计1个
        $n ++; //但考虑整体美观,大写字母计成一个高位字符
    }elseif ($ascnum >= 97 && $ascnum <= 122) {
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; //实际的byte数仍计1个
        $n ++; //但考虑整体美观,大写字母计成一个高位字符
    } else {//其他情况下,半角标点符号,
        $returnstr = $returnstr . substr ( $sourcestr, $i, 1 );
        $i = $i + 1; 
        $n = $n + 1;
    }
   }
   return $returnstr;
}

通过ASCII编码的规则,去判断每个字符在什么位置,去做定长截取。最后在拼接字符串。

这样截取的字符串,既满足了字符串限定的长度,也解决了截取过程中出现乱码字符的问题。

从而解决程序运行过程中出现的问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值