PHP 8.0 中用 mb_substr 截取中英文混排字符串应显式指定 UTF-8 编码,按字符数截取,确保中文、英文、Emoji 各算 1 字符;需启用 mbstring 扩展并调用 mb_internal_encoding('UTF-8'),避免乱码或截断不完整。

PHP 8.0 中用 mb_substr 截取中英文混排字符串,关键在于正确指定字符编码和长度单位(按字符数,不是字节数),避免乱码或截断不完整。
确保启用 mbstring 扩展并设置默认编码
PHP 8.0 默认启用 mbstring,但仍需确认:
- 检查 phpinfo() 中 mbstring 是否 loaded;
- 推荐显式设置内部编码,避免依赖默认值:
-
mb_internal_encoding('UTF-8');(建议在脚本开头或框架初始化处调用) - 若不确定源字符串编码,可用
mb_detect_encoding($str, ['UTF-8', 'GB2312', 'GBK'], true)辅助判断
用 mb_substr 按字符数安全截取
mb_substr 天然支持多字节字符,中英文、中文、Emoji 都算作「1 个字符」(前提是编码一致):
-
$result = mb_substr($str, 0, 10, 'UTF-8');—— 取前 10 个字符(非字节) - 起始位置和长度都按「Unicode 字符」计数,中文、英文字母、数字、空格各算 1
- 第三个参数(编码)强烈建议显式传入
'UTF-8',不依赖mb_internal_encoding的全局设置
处理截断后可能的不完整字符或空白问题
纯 mb_substr 不会破坏字符,但可能截在空格、标点后显得突兀。如需更友好效果,可简单后处理:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 末尾带空格或标点?用
rtrim($result, " \t\n\r\x00\x0B。!?,;:”’)】》)")清理 - 需要加省略号?先截 9 位再拼
'…':mb_substr($str, 0, 9, 'UTF-8') . '…' - 严格避免半角/全角符号被截断?无需额外操作 ——
mb_substr本身已按字符边界切分,不会出现「半个汉字」
一个完整示例
$str = "Hello世界!This is PHP8.0测试。";
mb_internal_encoding('UTF-8');
$result = mb_substr($str, 0, 12, 'UTF-8'); // 得到 "Hello世界!This "
结果是 12 个字符:H e l l o 世 界 ! T h i s (空格),没乱码,也没截断汉字。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










