使用mb_substr()函数可解决php中文截取乱码问题,因其按字符而非字节截取,避免汉字被拆分。需确保字符串为UTF-8编码并开启mbstring扩展。示例:mb_substr(“你好世界,欢迎使用PHP!”, 0, 5, ‘UTF-8’)输出“你好世界,”。若环境不支持mbstring,可用preg_match_all(‘/./u’, $str, $matches)拆分字符后重组截取。注意前后端编码统一为UTF-8,避免混用substr与mb_substr,推荐优先使用mb_substr函数。

PHP截取中文字符串出现乱码,主要是因为中文字符在UTF-8编码下占用多个字节(通常为3或4个字节),而使用如substr()这类按字节截取的函数时,容易将一个完整汉字拆开,导致乱码。解决这个问题的关键是使用支持多字节字符的操作函数。
使用mb_substr()函数安全截取中文
mb_substr() 是PHP中处理多字节字符串的核心函数,能正确识别中文字符边界,避免截断产生乱码。
- 确保开启了PHP的mbstring扩展(一般默认开启)
- 指定正确的字符编码,如’UTF-8′
- 语法:mb_substr($str, $start, $Length, ‘UTF-8’)
示例:
$chineseStr = "你好世界,欢迎使用PHP!"; echo mb_substr($chineseStr, 0, 5, 'UTF-8'); // 输出:你好世界,
替代方案:自定义截取函数兼容环境限制
如果服务器未开启mbstring扩展,可使用正则或逐字符判断的方式模拟截取。
立即学习“PHP免费学习笔记(深入)”;
利用preg_match_all匹配所有字符,再取出前N个:
function substr_utf8($str, $len) { preg_match_all('/./u', $str, $matches); return implode('', array_slice($matches[0], 0, $len)); } echo substr_utf8("测试字符串abc", 4); // 输出:测试字符
该方法通过 ‘/./u’ 模式将字符串按Unicode字符拆分,再重组,避免字节断裂。
注意事项与常见问题
为确保中文截取稳定,注意以下几点:
- 始终确认字符串编码为UTF-8,非UTF-8需先转换(如用mb_convert_encoding)
- 避免混合使用substr和mb_substr,逻辑混乱易出错
- 显示截取后内容时,前端页面也应设置UTF-8编码(zuojiankuohaophpcnmeta charset=”utf-8″>)
- 截取后加省略号时,注意总长度控制,防止超出显示区域
基本上就这些。只要用对函数、编码一致,中文截取就不会乱码。推荐优先使用mb_substr,简洁高效。环境受限时再考虑正则拆分方案,兼容性好但性能稍低。关键是理解字节与字符的区别,别再用substr处理中文了。