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

小伙伴们大家好,使用substr()截取中文字符乱码的问题怎么解决呢?

看下面的方法:   

方法一:


    使用php内置函数mb_substr(); 
    mb_substr( $str, $start, $length, $encoding ) 
            $str,需要截断的字符串 
            $start,截断开始处,起始处为0 
            $length,要截取的字符数 
            $encoding,网页编码,如utf-8,GB2312,GBK ,如果省略,则会使用内部字符编码

 <?php>
    $str = "我爱学PHP我想成为一名PHPER";
    echo mb_substr($str,0).'<br>';
    echo mb_substr($str,2,4).'<br>';
    echo mb_substr($str,0,4).'<br>';
    echo mb_substr($str,0,-2).'<br>';
    echo mb_substr($str,-8).'<br>';
    echo mb_substr($str,-8,5).'<br>';
    echo mb_substr($str,-8,-1).'<br>';
<?>

        结果如下图:

        需要注意的是$length为负数时,如为-1,则表示到尾部数第二个字符

        $start为负数时,如为-1,则表示从尾部数第一个字符

        

        疑问:当$encoding为默认或者utf-8的时候,结果是正常的,当为GB2312或者GBK的时候结果会出现乱码的情况,为什么?

        答:我的环境默认是UTF-8编码,所以默认的时候也是正常。

方法二:

        自定义函数; 通过join()和array_slice()自定义函数;

<?php 
	header('Content-Type:text/html;charset:utf8'); 
	//utf8编码字符串截取无乱码
	function substr_utf8($str,$start,$length=null){
	    return join("",array_slice(preg_split("//u",$str,-1,PREG_SPLIT_NO_EMPTY),$start,$length));
	}

	echo substr_utf8($str,0,10); //输出:我爱学PHP我想成为

?>

        结果如图:

        和使用mb_substr()得到一样的结果

        

        补充:   

        array_slice() 函数在数组中根据条件取出一段值,并返回。                

$a=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow","e"=>"brown");
print_r(array_slice($a,1,2,false));
print_r(array_slice($a,1,2,true));

$a=array("red","green","blue","yellow","brown");
print_r(array_slice($a,1,2));
print_r(array_slice($a,1,2,true));

        输出的值为:

        说明了当数组为关联数组时,preserve为true或false结果都一样会保留键值

        数组为索引数组时,preserve为true保留键值,false重置键值        

        

        array_slice(array,start,length,preserve)

                参数    描述
                array    必需。规定数组。
                start    必需。数值。规定取出元素的开始位置。 0 = 第一个元素。如果该值设置为正数,则从前往后开始取。 如果该值设置为负数,则从后向前取 start 绝对值。 -2 意味着从数组的倒数第二个元素开始。

                length    可选。数值。规定被返回数组的长度。如果该值设置为整数,则返回该数量的元素。如果该值设置为负数,则函数将在举例数组末端这么远的地方终止取出。 如果该值未设置,则返回从 start 参数设置的位置开始直到数组末端的所有元素。

                preserve    可选。规定函数是保留键名还是重置键名。可能的值:

                true - 保留键名
                false - 默认。重置键名

方法三:

        mb_strcut();

echo mb_strcut($str,0,3,'utf-8').'<br>';  // 我

echo mb_strcut($str,3,5,'utf-8').'<br>';  // 爱

        mb_strcut() 和mb_substr()类似,都是从字符串中提取子字符串,但是按字节数来执行,而不是字符个数。 如果截断位置位于多字节字符两个字节的中间,将于该字符的第一个字节开始执行。 这也是和substr()函数的不同之处,后者简单地将字符串在字节之间截断,这将导致一个畸形的字节序列。

        注意:

            占2个字节的:带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要二个字节编码

           占3个字节的:基本等同于GBK,含21000多个汉字

           占4个字节的:中日韩超大字符集里面的汉字,有5万多个

           一个utf8数字占1个字节

           一个utf8英文字母占1个字节

           少数是汉字每个占用3个字节,多数占用4个字节。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值