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

xiaoxiao2021-02-27  156

 小伙伴们大家好,使用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()自定义函数;

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个字节。

转载请注明原文地址: https://www.6miu.com/read-13072.html

最新回复(0)