php中获取字符串长度应优先使用mb_strlen($str, 'utf-8'),因strlen()仅返回字节数,对中文、emoji等多字节字符不准确;需显式指定utf-8编码以确保统计真实字符数。

PHP中获取字符串长度,最常用的是 strlen(),但它在处理中文、日文、emoji 等多字节字符时会出错——它返回的是字节数,不是字符数。真正安全的方式是用 mb_strlen(),但前提是必须正确设置编码。
strlen():只认字节,不认字符
strlen() 是 C 语言底层函数的封装,它逐字节扫描直到遇到 \0,完全不识别字符编码。对 ASCII 字符(如英文、数字、常见符号)没问题,但一旦出现 UTF-8 中文,一个汉字占 3 个字节,strlen() 就会返回 3 而不是 1。
- 例如:
$str = "你好"; echo strlen($str);输出 6(每个汉字 3 字节 × 2) - 再如:
$str = "??";(程序员 emoji,UTF-8 下可能占 4~7 字节),strlen()返回的是字节总数,毫无语义意义 - 直接用于截断、验证、分页等逻辑,极易导致乱码或越界
mb_strlen():要字符数,得配对编码
mb_strlen() 是多字节安全函数,能按指定编码统计“真实字符数”,但默认编码依赖 mb_internal_encoding() 设置,而非文件声明或 HTTP 头。
- 错误写法:
mb_strlen("你好")—— 若内部编码未设为 UTF-8,可能按 ISO-8859-1 解析,结果仍是 6 或乱码 - 推荐写法:
mb_strlen($str, 'UTF-8')—— 显式传入编码,不依赖全局配置,最稳妥 - 检查当前内部编码:
echo mb_internal_encoding();;设置它:mb_internal_encoding('UTF-8');(建议放在入口文件开头)
实际开发中的几个关键习惯
避免踩坑不是靠记函数区别,而是建立稳定编码习惯:
- 所有 PHP 文件保存为 UTF-8 无 BOM 格式
- HTTP 响应头或 HTML meta 中声明
charset=UTF-8 - 数据库连接、表、字段统一使用
utf8mb4编码(支持 emoji) - 字符串操作一律优先用
mb_*系列函数:mb_substr()、mb_stripos()、mb_strtolower()等 - 若需兼容旧环境且确定只有 ASCII,才考虑
strlen(),但务必加注释说明前提
快速自查:你的字符串长度是否可信?
加一行调试代码,比猜更可靠:
var_dump([ 'raw' => $str, 'strlen' => strlen($str), 'mb_utf8' => mb_strlen($str, 'UTF-8'), 'encoding' => mb_detect_encoding($str, ['UTF-8', 'GBK', 'BIG5'], true)]);
输出对比后,一眼看出差异来源:是编码检测不准?还是源数据本身混码?还是函数用错?
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











