PHP 7.4 中应使用 mb_strlen($text, 'UTF-8') 判断字符串长度,因其按字符而非字节计数,可正确处理中文、emoji、越南文等多字节字符;截取摘要须用 mb_substr($text, 0, $maxChars, 'UTF-8') 并配合清理空格与控制符。

PHP 7.4 判断字符串长度用于文章摘要,关键不是“数多少字节”,而是“数多少可显示的字符”——尤其当摘要要兼容中文、emoji、越南文或带调号的字母时,直接用 strlen() 会截出乱码或提前断开。
必须用 mb_strlen() 替代 strlen()
因为 strlen() 返回的是字节数。比如 UTF-8 下一个汉字占 3 字节,“你好”返回 6,但实际只有 2 个字符;而摘要按“20 字符”截取,你得的是字符数,不是字节数。
- 确保已启用
mbstring扩展(PHP 7.4 默认通常开启,可通过php -m | grep mbstring确认) - 统一指定编码为
'UTF-8':mb_strlen($text, 'UTF-8') - 若不确定输入编码,先用
mb_convert_encoding($text, 'UTF-8', 'auto')转换再计算
截取摘要要用 mb_substr(),不能用 substr()
substr() 按字节切,容易在中文、越南文(如 “đủ”)、emoji(如 “?”)中间硬砍,输出乱码或符号。
- 正确写法:
mb_substr($text, 0, $maxChars, 'UTF-8') -
$maxChars是你要的“字符个数”,不是字节数 - 第 4 个参数
'UTF-8'不可省略——否则依赖mb_internal_encoding(),易出错
加安全处理:去空格、防零宽、保语义完整
用户粘贴内容常含全角空格、零宽空格(U+200B)、换行符等,直接截可能开头结尾是空白,或在标点后硬截影响可读性。
- 先清理:
$clean = trim(mb_convert_encoding($text, 'UTF-8', 'auto')); - 去掉不可见控制符:
$clean = preg_replace('/[\x{200B}-\x{200F}\x{202A}-\x{202E}]/u', '', $clean); - 截完后建议加省略号(需判断是否真截断):
mb_strlen($clean, 'UTF-8') > $maxChars ? mb_substr($clean, 0, $maxChars, 'UTF-8') . '…' : $clean
特别注意越南文和 emoji 场景
越南文字母如 “ơ”, “ư”, “đ” 都是多字节 UTF-8 字符;emoji 如 “??” 是多个 Unicode 字符组合(含 ZWJ),mb_strlen() 能正确计为 1 个字符,但 JS 的 .length 会算成多个码元(如 7)。如果摘要要前后端长度一致(比如前端也截 50 个字符),PHP 侧需模拟 JS 行为:
- 用
strlen(mb_convert_encoding($s, 'UTF-16LE', 'UTF-8')) / 2得到与 JS.length对齐的值 - 但摘要场景通常以“人眼可见字符数”为准,推荐仍用
mb_strlen($s, 'UTF-8')—— 更符合阅读预期
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











