PHP处理中文必须启用mbstring扩展,否则mb_strlen()报错、json_encode()乱码、preg_match()失效;需先用php -m或php -i确认是否已安装并启用,未安装则通过包管理器补装或手动启用php_mbstring.dll,最后用测试脚本验证功能正常。
PHP 默认不启用 mbstring 扩展,但处理中文(如截取、编码转换、正则匹配)时几乎必用;没开启会导致 mb_strlen() 报错、json_encode() 中文变空或乱码、preg_match() 中文模式失效等问题。
不是所有 PHP 安装包都自带 mbstring,尤其某些精简版或 Docker 镜像。先查是否「存在但未启用」还是「压根没编译」:
php -m | grep mbstring —— 有输出说明已安装且启用php -i | grep "mbstring support" —— 输出 mbstring support => enabled 才算生效php-config --extension-dir,看返回路径下是否存在 mbstring.so(Linux/macOS)或 php_mbstring.dll(Windows)没有 .so 或 .dll 文件,说明编译时没加 --enable-mbstring,需重装 PHP 或用包管理器补装扩展包。
绝大多数生产环境用 apt/yum/dnf 安装 PHP,扩展也应走同源渠道,避免版本错配:
立即学习“PHP免费学习笔记(深入)”;
sudo apt update && sudo apt install php-mbstring # Ubuntu/Debian sudo yum install php-mbstring # CentOS 7 sudo dnf install php-mbstring # CentOS 8+/AlmaLinux/Rocky
装完后必须重启 Web 服务才能生效:
sudo systemctl restart apache2(Ubuntu)或 httpd(CentOS)sudo systemctl restart php*-fp
m(如 php8.1-fpm),注意版本号要匹配别只改 php.ini 就以为完事——扩展文件没装上,extension=mbstring 这行会静默失败。
官方 Windows ZIP 包默认带 php_mbstring.dll,只需启用:
php.ini(用 php --ini 确认路径),取消注释这一行:extension=php_mbstring.dll
extension_dir 指向正确的目录,例如:extension_dir = "ext"(相对路径)或完整路径如 C:\php\ext
php_mbstring.dll 确实存在于该目录下;若用的是线程安全(TS)版 PHP,但 DLL 是 NTS 版,会加载失败且无提示改完后必须重启 Web 服务器(如 Apache 或 Nginx + PHP-FPM),仅重启 PHP-CGI 进程不够。
写个最小测试脚本,别只信 phpinfo() 页面显示「enabled」:
输出应为:
bool(true)bool(true)UTF-8(或你设置的默认编码)4(不是 8,说明多字节处理生效)如果 mb_strlen() 返回 8,大概率是 mbstring.func_overload 被设为非零值(已废弃,PHP 7.2+ 移除),或 default_charset 和 mbstring.internal_encoding 不一致导致隐式转换出错。