应使用 mb_strlen($str, 'utf-8') 计算含全角字符的字符串长度,因 strlen() 仅计字节导致结果错误;需先清理零宽字符和全角空格,再 trim 后精确计数。

PHP 8.0 判断含全角字符的字符串长度,关键不是“识别全角”,而是**正确按 Unicode 字符计数**——全角字母、数字、标点(如ABC、123、。!?)在 UTF-8 中均占多个字节,但语义上各为 1 个字符,必须用 mb_strlen() 并显式指定编码。
为什么 strlen() 不行
strlen() 只数字节:一个全角英文字母(U+FF21–U+FF3A)在 UTF-8 中占 3 字节,strlen("A") 返回 3;全角数字或中文标点同理。这完全偏离用户感知和业务规则(比如“昵称限 10 字”,显然指 10 个可显示单位,不是 10 字节)。
必须用 mb_strlen() 并指定 'UTF-8'
全角字符属于 Unicode 基本多文种平面(BMP),mb_strlen($str, 'UTF-8') 能准确将其计为 1:
-
mb_strlen("ABC", 'UTF-8')→ 返回 3 -
mb_strlen("Hello,世界!", 'UTF-8')→ 返回 9(H/e/l/l/o/,/世/界/!) - 中英文全角、半角、中文、emoji 混排时,统一按码点计数,无需额外分类逻辑
注意编码归一化与零宽干扰
用户粘贴内容常混入不可见字符,影响真实长度判断:
- 全角空格(U+3000)会被
mb_strlen()计为 1,但业务上可能需过滤:str_replace("\xe3\x80\x80", '', $str) - 零宽字符(如 U+200B)虽不属“全角”,却常随复制进入,必须清除:
preg_replace('/[\x{200b}-\x{200f}\x{feff}]/u', '', $str) - 建议先清理再测长:
$clean = preg_replace('/[\x{200b}-\x{200f}\x{feff}]/u', '', $str); $clean = str_replace("\xe3\x80\x80", ' ', $clean); $len = mb_strlen(trim($clean), 'UTF-8');
兼容性与性能提醒
PHP 8.0 默认启用 mbstring,但仍需确认:
- 运行
extension_loaded('mbstring')防止函数未定义 - 避免依赖
mb_internal_encoding(),始终显式传'UTF-8' - 对超长文本(如 >50KB),可先用
strlen()快筛字节数(如 >150KB 大概率超 5000 字符),再调mb_strlen()精确校验
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











