问题描述:
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;
参考文章地址: