必须用 mb_strlen($password, 'UTF-8') 判断密码字符长度,因 strlen() 返回字节数,无法正确处理中文、emoji等多字节字符;需显式指定 UTF-8 编码并确保 mbstring 扩展已启用。

PHP 7.4 中判断字符串长度用于密码校验,核心是**按字符数而非字节数衡量**,否则中文、emoji、越南文等多字节字符会导致校验失效(比如“ newPassword123”看似 13 个字符,但含 emoji 时字节数可能达 17,用 strlen() 就会误判超长或不足)。
必须用 mb_strlen() 替代 strlen()
密码字段可能含任意 Unicode 字符(如中文提示、用户昵称混入、特殊符号),strlen() 返回的是 UTF-8 字节数,不能反映真实“字符长度”。
-
mb_strlen($password, 'UTF-8')才能准确返回用户看到的字符个数 - 必须显式传入 'UTF-8' 编码参数——不写则依赖
mb_internal_encoding(),线上环境易不一致 - 确保 PHP 已启用 mbstring 扩展(PHP 7.4 默认通常开启,可通过
extension=mbstring确认)
密码最小长度校验示例
例如要求密码至少 8 个字符:
$password = $_POST['password'] ?? '';
if (!is_string($password) || mb_strlen($password, 'UTF-8') < 8) {
die('密码至少需 8 个字符');
}
- 先用
is_string()排除null、false、数组等非字符串值,避免mb_strlen()报错或静默转换出错 - 不建议用
empty()或== ''判空——它们对'0'、0、false都返回 true,而密码值'0'是合法且有效的 - 真正空密码只有一种情况:
$password === ''
前端与后端长度必须对齐
如果前端用 JavaScript 的 String.length 做实时提示(如“还差 2 位”),PHP 后端不能直接比 mb_strlen(...) ——因为 JS 的 .length 统计的是 UTF-16 码元数(emoji 如 ? 占 2),而 mb_strlen(..., 'UTF-8') 返回的是 Unicode 字符数(? 是 1)。
立即学习“PHP免费学习笔记(深入)”;
- 要完全对齐 JS 行为,用:
function jsStringLength(string $s): int {<br> $utf16 = mb_convert_encoding($s, 'UTF-16LE', 'UTF-8');<br> return strlen($utf16) / 2;<br>} - 该函数结果与
"?".length一致,适合前后端统一策略(如限制最大 20 个 JS 码元) - 注意:
mb_convert_encoding()必须启用 mbstring,目标编码必须是 'UTF-16LE'(不能用 'UTF-16')
额外安全建议
仅校验长度不够,密码校验还需结合其他维度:
- 用
trim()去首尾空白再测长度,防止用户输空格凑数 - 若需排除全角空格、零宽字符等,可:
mb_strlen(trim(preg_replace('/[\p{Z}]/u', '', $password)), 'UTF-8') - 永远不要信任前端传来的长度值——用户可用 curl 绕过,后端必须独立计算并拒绝



















