应统一启用并配置 mb_ 系列函数,确保 mbstring 扩展已启用、设好 mb_internal_encoding('utf-8'),再使用 mb_strlen、mb_substr 等处理中文,避免字节级函数导致乱码。

处理中文等多字节字符时,直接用 strlen、substr、strpos 会出错——它们按字节算,而 UTF-8 中一个汉字占 3 字节,结果长度错、截断乱、位置偏。真正可靠的方式是统一启用并配置 mb_ 系列函数,并设好默认编码。
确保 mbstring 扩展已启用
这是所有 mb 函数运行的前提:
- Linux(如 Ubuntu)执行:
sudo apt install php-mbstring && sudo systemctl restart apache2(或php-fpm) - Windows 用户打开
php.ini(路径用php --ini查),取消注释:extension=mbstring - 验证是否生效:运行
var_dump(extension_loaded('mbstring'));输出bool(true)即成功
设置统一的内部编码(关键一步)
避免每次调用都传 encoding 参数,推荐在项目启动处(如入口文件或配置脚本)统一设定:
-
mb_internal_encoding('UTF-8');—— 这会影响mb_strlen、mb_substr、mb_strpos等多数函数的默认行为 - 建议放在
index.php开头或框架的初始化逻辑中,且只设一次 - 若需临时切换,可用
mb_internal_encoding('GB2312'),但不推荐混用
常用中文处理函数对照模板
以下为安全处理中文字符串的推荐写法(已适配 UTF-8):
- 获取真实字符数:
mb_strlen($str)(不是strlen($str)) - 截取前 5 个汉字:
mb_substr($str, 0, 5)(不会切出半个汉字) - 从右往左找最后一次出现位置:
mb_strripos($str, '搜索词')(支持中文子串) - 判断是否含中文:
mb_ereg('^[\x{4e00}-\x{9fff}]+$', $str, 'u')或更稳妥用preg_match('/^[p{Han}]+$/u', $str)
编码转换与校验(防乱码兜底)
接收外部输入(如表单、API)时,编码不确定,需主动检测和转正:
- 检测可能编码:
$enc = mb_detect_encoding($input, ['UTF-8', 'GB2312', 'BIG5'], true); - 强制转为 UTF-8:
$safe = mb_convert_encoding($input, 'UTF-8', $enc ?: 'UTF-8'); - 校验有效性(防无效 UTF-8 攻击):
mb_check_encoding($safe, 'UTF-8')返回true才继续处理
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











