应使用mb_substr函数替代substr处理utf-8中文字符串,需设置mb_internal_encoding('utf-8')、显式指定编码参数、配合mb_strlen计算字符长度,并在入口文件统一配置编码以避免乱码。

如果您在PHP中对中文字符串进行截取操作时出现乱码,通常是因为使用了不支持多字节字符的函数(如substr)处理UTF-8编码的中文文本。以下是解决此问题的步骤:
一、使用mb_substr函数替代substr
mb_substr是PHP内置的多字节字符串截取函数,能正确识别UTF-8等编码下的中文字符边界,避免截断字节导致乱码。
1、确认当前脚本文件保存为UTF-8无BOM格式。
2、在代码开头设置内部编码为UTF-8:mb_internal_encoding('UTF-8');
立即学习“PHP免费学习笔记(深入)”;
3、使用mb_substr替代substr,语法为:mb_substr($str, $start, $length, 'UTF-8');
4、例如截取字符串前5个中文字符:$result = mb_substr('你好世界PHP', 0, 5, 'UTF-8');
二、指定正确的字符编码参数
mb_substr默认使用mb_internal_encoding()返回的编码,若未显式设置或与实际字符串编码不一致,仍可能出错。显式传入编码可提升可靠性。
1、获取字符串实际编码(如不确定):$encoding = mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true);
2、将检测到的编码作为第四个参数传入:mb_substr($str, 0, 10, $encoding);
3、对已知为UTF-8的字符串,强制指定:mb_substr($str, 0, 8, 'UTF-8');
三、配合mb_strlen计算真实字符长度
中文字符串的字节数与字符数不同,直接用strlen计算长度再截取会导致越界或截断。必须用mb_strlen获取字符数以确定安全截取范围。
1、获取字符串中文字符总数:$charCount = mb_strlen($str, 'UTF-8');
2、判断是否需要截取:if ($charCount > 12) { $short = mb_substr($str, 0, 12, 'UTF-8') . '...'; }
3、避免负数起始位置错误:$pos = max(0, $charCount - 10); $tail = mb_substr($str, $pos, 10, 'UTF-8');
四、设置默认编码全局生效
在项目入口文件(如index.php)中统一设置多字节函数默认编码,避免每个调用都重复指定,降低遗漏风险。
1、在所有mb_*函数调用前执行:mb_regex_encoding('UTF-8');
2、同时设置内部编码:mb_internal_encoding('UTF-8');
3、验证设置是否成功:var_dump(mb_internal_encoding()); // 应输出string(5) "UTF-8"
五、使用iconv_substr作为备选方案
当mbstring扩展未启用时,可借助iconv扩展的iconv_substr函数实现类似功能,但需注意其参数顺序与mb_substr不同。
1、检查iconv扩展是否可用:if (function_exists('iconv_substr')) { ... }
2、调用方式为:iconv_substr($str, $start, $length, 'UTF-8');
3、注意:iconv_substr第三个参数是长度,第四个是源编码,不接受目标编码参数,且对超长$length会自动截断至末尾。











