最稳妥方式是substr($str, 0, 1),兼容性好、不依赖编码、空字符串安全;需取首个unicode字符时用mb_substr($str, 0, 1, 'utf-8'),但须确保mbstring扩展已启用。

用 substr() 取首字符最稳妥
PHP 里取字符串第一个字符,substr($str, 0, 1) 是兼容性最好、语义最清晰的方式。它不依赖编码,也不怕空字符串或非 UTF-8 字符串出错。
- 如果
$str是空字符串,substr()返回空字符串,不会警告 - 对 ASCII 和常见 UTF-8 中文都安全(因为只取字节起始位置,且长度为 1;多字节字符虽可能截断,但「首字符」在单字节语境下本就指首字节)
- 避免用
$str[0]—— PHP 8.0+ 对非字符串类型会报TypeError,且对 UTF-8 多字节字符返回的是第一个字节,不是逻辑上的“第一个 Unicode 字符”
需要真正取首个 Unicode 字符?用 mb_substr()
如果你的字符串含中文、emoji 或其他多字节字符,且业务上要求“第一个可视字符”,就得用多字节函数。
- 必须指定编码:
mb_substr($str, 0, 1, 'UTF-8'),漏掉第四个参数在某些环境会按ISO-8859-1解析,导致乱码 -
mb_substr()在未开启mbstring扩展时会致命报错Fatal error: Uncaught Error: Call to undefined function mb_substr(),上线前务必检查扩展是否启用 - 性能略低于
substr(),但对单次调用几乎无感;高频循环中才需权衡
$str[0] 能不能用?看 PHP 版本和类型
直接用数组语法取首字符,在老项目里很常见,但风险明确:
- PHP 7.4 及更早:对字符串可行,但对
null、int、array等类型静默转成字符串再取,行为难预测 - PHP 8.0+:仅当
$str是字符串时合法;其他类型直接抛TypeError - 即使
$str是字符串,$str[0]返回的是字节,不是字符 —— 比如"你好"[0]得到的是ä(UTF-8 首字节),不是你
边界情况必须检查:空字符串、null、非字符串
真实业务里,$str 往往来自用户输入或数据库字段,不能默认非空非 null。
立即学习“PHP免费学习笔记(深入)”;
- 先判断:
is_string($str) && $str !== '',再取字符;否则直接返回默认值(如空字符串或false) - 别用
empty($str)判空——它会把"0"也当空,而"0"[0]明显是合法的首字符 - 如果上游可能传
null,用空合并操作符更简洁:$first = $str ?? ''; $result = substr($first, 0, 1);
$str[0] 和 substr($str,0,1) 在 UTF-8 下根本不是一回事,以及忘了检查 mbstring 扩展是否存在。











