php中strlen()返回字节数而非字符数,导致中文长度计算错误;应启用mbstring扩展并使用mb_strlen($str, 'utf-8')按字符精确计数。

PHP里没有独立的“字符串类型”声明语法,string 是运行时自动识别的基础标量类型,你不需要(也不能)像 int $x 那样显式标注。真正影响行为的是你用什么函数处理它,以及编码是否一致。
为什么 strlen() 返回值不对?中文变乱码或长度错
这是最常踩的坑:直接用 strlen() 处理含中文、日文等 UTF-8 字符的字符串,结果是字节数而非字符数。比如 "你好" 在 UTF-8 下占 6 字节,strlen() 返回 6,但实际只有 2 个字符。
- 必须开启
mbstring扩展(检查phpinfo()中是否有mbstring support => enabled) - 统一指定编码参数,例如
mb_strlen($str, 'UTF-8'),不传编码可能 fallback 到系统默认(不可靠) -
mb_substr()同理,substr()对多字节字符会截断字节流,导致乱码;mb_substr($str, 0, 2, 'UTF-8')才安全
strpos() 找不到却没报错?返回 false 被当成 0
strpos() 在找到子串位于开头时返回 0,而没找到时返回 false。用 if (strpos($str, 'abc')) 会把位置 0 当作假值跳过——逻辑错误就在这儿。
- 务必用严格比较:
if (strpos($str, 'abc') !== false) - 大小写不敏感查找用
stripos(),不是strpos(..., strtolower())这种低效写法 - 要找最后一次出现的位置,用
strrpos();要返回匹配后剩余部分,用strstr()
str_replace() 替换失败?数组参数顺序或大小写搞反了
str_replace() 参数顺序是 str_replace($search, $replace, $subject),新手常把前两个弄反,或者忽略大小写敏感性。
- 批量替换多个词时,
$search和$replace可以是数组,但必须一一对应;长度不匹配会导致空值填充 - 需要忽略大小写,改用
str_ireplace(),别自己先strtolower()整个字符串再替换——会破坏原始大小写格式 - 只替换首次出现?
str_replace()不支持,得用preg_replace()加1限制,或手写循环 +strpos()+substr()
真正难的不是记住函数名,而是每次操作前下意识问一句:这个字符串当前编码是什么?我要的是字节还是字符?要不要保持原始大小写?漏掉任意一环,线上就可能出现“中文显示成”或“搜索永远找不到”的问题。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











