实现中文字串截取无乱码的方法

UTF-8中文截取函数
在PHP中,substr()函数截取带有中文字符串的话,可能会出现乱码,这是因为中西文一个字节所占有的字节数不一样,而substr的长度参数是按照字节去算的,在GB2312编码时,一个中文占2个字节,英文为1个字节,而在UTF-8编码当中,一个中文可能占有2个或3个字节,英文或半角标点占1字节。
解决方法
UTF-8编码的字符可能由1-3个字节组成,具体数目可以由第一个字节判断出来。
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符,否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。
<?php
$a="我是程序员";
class Dx
{
 
     private $str;
       public function msubstr($string,$start,$length)
       {
              if(strlen($string)>$length)
              {
                     $n=0;
                     $str="";
                     $len=$start+$length;
                     for($i=$start;$i<$len;$i++)
                     {
                            if(ord(substr($string,$n,1))>224)
                            {
                                   $str.=substr($string,$n,3);
                                   $n+=3;
                                   $i++;
                            }
                            elseif(ord(substr($string,$n,1))>192)
                            {
                                   $str.=substr($string,$n,2);
                                   $i++;
                            }
                            else
                            {
                                   $str.=substr($string,$n,1);
                            }
                     }
                     return $str;
              }
              else
              {
                     return $string;
              }     
       }
       public function msub($string,$start,$length)
       {
              if(strlen($string)>$length)
              {
                     $str="";
                     $len=$start+$length;
                     for($i=$start;$i<$len;$i++)
                     {
                            if(ord(substr($string,$i,1))>0xa0)
                            {
                                   $str.=substr($string,$i,2);
                                   $i++;
                            }
                            else
                            {
                                   $str.=substr($string,$i,1);
                            }
                     }
                     return $str;
              }
              else
              {
                     return $string;
              }     
       }

}
$sub = new Dx();
echo $sub->msubstr($a,0,8);//我是程序
?>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
除了上面的方法,还可以使用mb_substr来解决,代码如下:
<?php
$a="wo的name是中国!";
echo mb_substr($a,0,9,'UTF-8');//wo的name是中
echo substr($a,0,15);//wo的name是中
?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值