应使用 mb_strlen() 判断字符串字符数,mb_strwidth() 仅用于计算视觉宽度:中文等全角字符计为2单位,英文字母等半角字符计为1单位,与数据库字段长度等语义不符。

不推荐用 mb_strwidth() 来「判断字符串长度」,它解决的是另一个问题。
mb_strwidth 是用来算显示宽度的,不是字符数
mb_strwidth() 返回的是字符串在终端或等宽字体下的「视觉宽度」:中文、日文、全角标点算 2 单位,英文字母、数字、半角标点算 1 单位。比如:
-
mb_strwidth("你好ABC", "UTF-8")→ 返回 7(“你好”各占 2,“A/B/C”各占 1) -
mb_strlen("你好ABC", "UTF-8")→ 返回 5(统一按字符计:你/好/A/B/C)
如果你要做表单校验(如“用户名最多 10 个字符”)、数据库字段长度比对、截断逻辑,要的是「用户感知的字符个数」,不是排版宽度——这时候必须用 mb_strlen($str, 'UTF-8')。
PHP 7.1 下 mb_strwidth 可用,但用途错位
PHP 7.1 已支持 mb_strwidth(),前提是启用了 mbstring 扩展。但它设计初衷是为格式化输出服务的,例如:
- 控制命令行日志每行最大显示宽度
- 生成对齐的表格文本
- 配合
mb_strimwidth()做「按视觉宽度截断+加省略号」
拿它当长度判断函数,会导致语义混淆:用户填了 “Hello你好”,mb_strwidth 返回 8,mb_strlen 返回 7,而数据库 VARCHAR(10) 限制的是后者——三者数值不一致,容易埋坑。
真正该用的组合很明确
在 PHP 7.1 环境中判断含中文的字符串「有多少个字符」,请坚持以下写法:
- ✅
mb_strlen($str ?? '', 'UTF-8')—— 安全、准确、跨环境一致 - ✅ 配合
is_string($str) && $str !== ''做前置校验(避免传 null 或空) - ✅ 若需兼容旧数据(如 GBK 编码),先
mb_convert_encoding($str, 'UTF-8', 'GBK')再计数 - ❌ 不要用
strlen()(字节计数,中文返回 3) - ❌ 不要用
mb_strwidth()(宽度计数,中英文权重不同)
它不复杂但容易忽略。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











