应使用 mb_strlen(),因其按字符而非字节计数,避免中文、emoji等UTF-8多字节字符长度失真;必须显式指定编码 mb_strlen($str, 'UTF-8'),否则可能因locale导致结果不可控。

PHP 中用 strlen() 还是 mb_strlen() 判断字符串长度?
中文、emoji 或 UTF-8 多字节字符下,strlen() 会按字节计数,比如一个中文字符算 3 字节,导致长度严重失真;mb_strlen() 才真正按「字符」计数。实际业务中(如截断标题、校验用户名),你几乎总是该用 mb_strlen(),且必须显式指定编码:mb_strlen($str, 'UTF-8')。漏掉第二个参数在某些 PHP 版本里会 fallback 到 locale 编码,结果不可控。
把字节数转成带单位的可读格式(KB/MB/GB)
这不是字符串长度问题,而是字节数格式化——常见于文件大小、缓存体积、日志内容长度等场景。别手写除法链,用现成逻辑更稳:
function formatBytes($bytes, $decimals = 2) {
$units = ['B', 'KB', 'MB', 'GB', 'TB'];
for ($i = 0; $bytes >= 1024 && $i < count($units) - 1; $i++) {
$bytes /= 1024;
}
return number_format($bytes, $decimals) . ' ' . $units[$i];
}注意点:
-
$bytes必须是整数或 float,不能是字符串(否则number_format()可能出错) - 循环上限设为
count($units) - 1是防止数组越界,TB后不再除 - 如果输入是负数,这个函数不处理,需提前校验
字符串长度直接显示 KB?小心单位混淆
有人想把「字符数」强行标成 KB,比如 mb_strlen($s) . ' KB'——这是典型概念错误。字符数 ≠ 字节数,更不等于存储单位。除非你明确知道:当前字符串全是 ASCII(1 字符 = 1 字节),且业务约定用「千字符」当 KB 用(极少见)。否则,真要报大小,请先用 mb_strlen($s, 'UTF-8') 得字符数,再用 mb_convert_encoding($s, 'UTF-8', 'UTF-8') 确保编码一致后,用 strlen() 获取真实字节数,再喂给 formatBytes()。
立即学习“PHP免费学习笔记(深入)”;
性能敏感场景下怎么选?
高频调用(如日志中间件、API 响应体统计)中,mb_strlen() 比 strlen() 慢约 3–5 倍,因为要解析多字节序列。若你能 100% 确保输入只有 ASCII(比如纯英文 token、base64 字符串),就用 strlen();否则宁可加一层缓存或预判:if (strpos($str, "\x80") === false) { ... } 快速跳过 UTF-8 字节检测,再决定用哪个函数。
最易被忽略的是:不同环境默认 mbstring.func_overload 设置可能开启,让 strlen() 实际调用 mb_strlen(),造成行为不一致。上线前务必检查 phpinfo() 或 ini_get('mbstring.func_overload')。











