PHP函数substr()截取中文字符乱码

问题描述:

substr()函数在截取字符串时是按字节来截取的,在GBK/GB2312编码下,一个中文占2个字节;UTF-8/unicode编码下,一个中文占3个字节。
<?php
$text = "竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。";
echo $text,"\n"; // 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
echo strlen($text)."\n"; // 57
echo mb_strlen($text),"\n"; // 19
$str1 = substr($text, 11);
echo $str1."\n"; // �轻胜马,谁怕?一蓑烟雨任平生。

原因分析:

substr函数在截取字符时是按字节来截取的,中文字符在GB2312编码时为2个字节,utf-8编码时为3个字节,所以截取指定长度的字符串时如果截断了汉字,那么返回的结果显示出来便会出现乱码。


解决方案:

使用mb_substr()函数可保证不会出现乱码,但缺点是长度统计变成了字符数统计,而不是按字节数统计。用于显示时,同样长度的中文结果和英文结果会出现较大的显示长度的差别。

<?php
$text = "竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。";
echo $text,"\n"; // 竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。
echo strlen($text)."\n"; // 57
echo mb_strlen($text),"\n"; // 19
$str1 = substr($text, 11);
echo $str1."\n"; // �轻胜马,谁怕?一蓑烟雨任平生。
$str2 = mb_substr($text, 11); // 一蓑烟雨任平生。
echo $str2;

参考文章地址:

猜你喜欢

转载自blog.csdn.net/username666/article/details/110223204
今日推荐