小伙伴们大家好,使用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个字节。