PHP 7.2 中判断字符串截取后长度,必须统一使用 mb_substr() 和 mb_strlen() 并显式指定 UTF-8 编码,避免 substr() 和 strlen() 因字节与字符混淆导致中文乱码或长度误判。

PHP 7.2 中判断字符串截取后的长度,核心是先用 substr() 或 mb_substr() 截取,再用对应长度函数验证。关键在于:**截取方式必须与长度计算方式严格匹配**,否则中文等多字节字符会出错。
区分字节长度和字符长度
PHP 7.2 默认的 strlen() 返回的是字节数,不是“人眼看到的字符数”。例如:
-
strlen("你好")返回 6(UTF-8 下每个汉字占 3 字节) -
mb_strlen("你好", "UTF-8")返回 2(真实字符数)
如果你按字符意图截取(比如“取前 5 个汉字”),却用 strlen() 判断结果长度,就会误判。务必统一使用 mb_* 系列函数处理含中文、日文等多字节字符的场景。
安全截取并获取截后长度的写法
推荐组合:mb_substr() + mb_strlen(),并显式指定编码:
立即学习“PHP免费学习笔记(深入)”;
- 先设内部编码(避免旧环境默认 ISO-8859-1 导致乱码):
mb_internal_encoding("UTF-8"); - 截取并测长示例:
$str = "Hello世界123";<br> $cut = mb_substr($str, 0, 7, "UTF-8"); // 取前 7 个字符<br> $len = mb_strlen($cut, "UTF-8"); // 得到 7
- 若不确定原始编码,可用
mb_detect_encoding()辅助识别,但不保证 100% 准确,建议业务层约定输入为 UTF-8
注意 substr() 的陷阱
substr() 是字节级操作,对多字节字符串极不安全:
-
substr("你好", 0, 4)可能截出半个汉字(如"你"),导致显示乱码或mb_strlen()计算异常 - 此时
strlen()返回 4,但mb_strlen()可能返回 1 或 false(取决于是否能修复非法序列) - 除非你明确处理纯 ASCII 场景(如 token、base64、英文路径),否则不要用
substr()处理用户输入或含中文的字符串
边界情况检查建议
截取后应主动验证是否符合预期:
- 检查是否为空:
if ($cut === "" || $cut === false) - 确认长度达标:
if (mb_strlen($cut, "UTF-8") ,说明原字符串不够长 - 若需补足长度(如固定字段),用
str_pad()或mb_str_pad()(PHP 8.2+)更稳妥



















