推荐使用 mb_substr($username, 0, 6, 'UTF-8') 安全截取前6个字符,它按字符而非字节计算,兼容中文、emoji、英文混排,避免乱码;禁用 substr() 等字节截取函数。

用户名截取前几位显示,核心就两点:**按字符数切,不是按字节数切;中文、emoji、英文混排时不能乱码。** PHP 7.4 默认支持 mb_substr(),这是最稳妥的做法。
用 mb_substr() 安全截取(推荐)
它按“字符”而非“字节”计算,自动适配 UTF-8 编码下的中文、标点、表情符号:
-
mb_substr($username, 0, 6, 'UTF-8')→ 取前 6 个完整字符(比如“张三李四✨”截成“张三李四”) - 第 3 个参数是字符长度,不是字节数;第 4 个参数必须显式写
'UTF-8',避免依赖默认编码 - 如果用户名为空或长度不足 6,
mb_substr会自动返回原字符串,不会报错
别用 substr() 直接切中文名
substr($username, 0, 6) 在 UTF-8 下极大概率出乱码:
- “你好世界”共 4 个汉字 → 实际占 12 字节
-
substr(..., 0, 6)只取前 6 字节 → 可能卡在“你”(3 字节)和“好”(3 字节)中间,输出类似“你” - 即使加
iconv转码再substr,也解决不了字节截断本质问题,反而增加出错环节
批量处理数组里的用户名
如果是一组用户数据(如从数据库查出的数组),可用 array_map 统一截取:
立即学习“PHP免费学习笔记(深入)”;
$names = array_map(fn($n) => mb_substr($n, 0, 5, 'UTF-8'), $userList);- 或带空值防护:
mb_substr((string)$n, 0, 5, 'UTF-8'),避免传入 null 或数字时报 Warning
前端显示时的补充建议
后端截取只是第一步,前端展示也需配合:
- CSS 加
text-overflow: ellipsis防止超长溢出 - 必要时保留原始用户名做 title 提示:
<span title="" echo htmlspecialchars>""><?php echo $short_name; ?></span> - 避免在 JS 里再用
.substring()二次截取——JS 的 substring 同样按 UTF-16 码元计数,遇到 emoji(如 ?)可能切半



















