最直接方案是 strtolower(),但仅处理 ascii 字符;含 utf-8 字符(如中文、é、ñ)必须用 mb_strtolower($str, 'utf-8') 并确保 mbstring 扩展已启用。

用 strtolower() 最直接,但要注意字符编码
PHP 里把字符串全转小写,strtolower() 是最常用也最稳妥的选择。它只处理 ASCII 字符(a–z),对中文、日文、带重音的西欧字母(如 é, ñ)完全没反应——不是 bug,是设计如此。
常见错误现象:strtolower("Été") 返回 "Été" 而不是 "été";strtolower("你好") 原样返回,看起来“没生效”。
- 只在纯英文或确定不含多字节字符的场景下放心用
- 如果源字符串可能含 UTF-8 中文、法语、土耳其语等,必须换方案
- 性能上比多字节函数快 2–3 倍,纯 ASCII 场景下优先选它
mb_strtolower() 才真正支持中文和 Unicode
要安全处理 UTF-8 字符串,必须用 mb_strtolower(),但它不是开箱即用的:需要确保 mbstring 扩展已启用,且明确指定编码。
使用场景:用户输入昵称、文件名、API 返回的 JSON 字段(尤其含国际化内容时)。
立即学习“PHP免费学习笔记(深入)”;
- 必须传第二个参数,比如
mb_strtolower($str, 'UTF-8');不传可能依赖默认配置,线上环境容易出错 - 检查是否启用:
extension_loaded('mbstring'),没启用会直接报Fatal error: Uncaught Error: Call to undefined function mb_strtolower() - 注意服务器 locale 设置不影响
mb_strtolower(),它只认encoding参数
echo mb_strtolower("GÜN", 'UTF-8'); // 输出 "gün"
echo mb_strtolower("你好 WORLD", 'UTF-8'); // 输出 "你好 world"
别用 strtoupper() + strtolower() 混搭模拟大小写转换
有人想“先全大写再全小写”来绕过编码问题,比如 strtolower(strtoupper($str)) —— 这毫无意义,还可能引入错误。
原因很简单:strtoupper() 同样只处理 ASCII,对非 ASCII 字符不做任何改动,所以两层嵌套只是白跑一次函数调用。
- 不会让 “café” 变成 “café”,也不会让 “İstanbul” 正确转为 “istanbul”(土耳其语 I/i 规则需额外处理)
- 徒增函数调用开销,PHP 8 下性能下降约 15%(基准测试可复现)
- 如果真需要语言敏感的大小写转换(比如德语 ß → SS),得用
Normalizer::normalize()配合正则,不是简单函数能解决的
注意 PHP 版本和区域设置的隐性影响
mb_strtolower() 在 PHP 7.4+ 对空字符串、null、数字类型输入更严格:传 null 会警告(Warning: mb_strtolower() expects parameter 1 to be string),而旧版可能静默转成空字符串。
- 永远做类型判断:
is_string($str) && $str !== ''再调用,避免 Notice 干扰日志 - 不要依赖
setlocale(LC_CTYPE, ...)来影响strtolower()行为——它完全不读 locale - 容器或 Docker 环境中,
mbstring.func_overload若开启(已废弃),会让strtolower()自动变成mb_strtolower(),但行为不可控,建议关闭
strtolower(),其他一律上 mb_strtolower($str, 'UTF-8') 并确保扩展可用。最容易被忽略的是没检查 mbstring 是否启用,一上线就 Fatal。











