PHP 7.4 中 substr() 截中文乱码,因按字节操作而 UTF-8 中文占 3 字节;应启用 mbstring 扩展,改用 mb_substr($str, $start, $length, 'UTF-8'),并统一全链路 UTF-8 编码。

PHP 7.4 中用 substr() 截取中文显示问号或乱码,根本原因是该函数按**字节**而非**字符**操作,而 UTF-8 下一个中文占 3 字节。截断位置落在汉字中间时,就产生非法字节序列,浏览器无法解析,最终显示为 或 ?。
确认并启用 mbstring 扩展
这是最直接有效的前提:
- 运行
phpinfo(),搜索 mbstring,确认状态为 enabled - 若未启用,编辑
php.ini,取消注释extension=mbstring(Linux 下可能是extension=php_mbstring.so) - 保存后重启 Web 服务(如 Apache/Nginx + php-fpm)
- 在代码中加一句验证:
var_dump(extension_loaded('mbstring'));→ 必须返回 bool(true)
改用 mb_substr() 替代 substr()
语法与 substr() 类似,但第四个参数必须显式指定编码:
mb_substr($str, $start, $length, 'UTF-8')- 例如:
echo mb_substr('杭州西湖很美', 0, 4, 'UTF-8');→ 输出 “杭州西湖” - 注意:
$length指的是字符数(不是字节数),所以截 4 个汉字就是写4,无需换算 - 若省略第四个参数,函数可能依赖系统默认编码(如 ISO-8859-1),仍会出错
统一 PHP 内部编码为 UTF-8
避免 mb_ 系列函数因内部编码不一致导致计算偏差:
- 在项目入口文件(如
index.php)最顶部添加:mb_internal_encoding('UTF-8'); - 这行必须在任何字符串操作、数据库连接、模板输出之前执行
- 它确保
mb_strlen()、mb_strpos()等函数都按 UTF-8 解析
检查全链路 UTF-8 是否一致
单靠替换函数还不够,乱码常是多环节叠加导致:
- PHP 文件本身:用编辑器(如 VS Code、PhpStorm)确认源码保存为 UTF-8 无 BOM
-
HTTP 响应头:在 PHP 脚本开头加
header('Content-Type: text/html; charset=UTF-8'); -
HTML 页面:在
中包含 -
数据库连接:PDO 连接串中加入
;charset=utf8mb4,MySQLi 使用mysqli_set_charset($conn, 'utf8mb4')
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











