用户从手机复制昵称过来,前后带全角空格,接口判空返回 昵称不能为空。trim 之后 strlen 还是 9,日志里值开头的字节是 e3 80 80。乍看像缓存或者权限的锅,追下去往往不是。
php -r 'var_dump(trim(" abc ") === "abc");'
php -r 'var_dump(preg_replace("/^[\\s\\x{3000}]+/u", "", " abc "));'
追下去是这么回事:PHP 的 trim 默认只去空格 制表符 换行 回车 NUL 和垂直制表符这几个字符,全角空格 U+3000 和 NBSP 都不在表里。它们在字符集层面是合法可见字符,trim 没有理由动。
「全角空格」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,用 preg_replace 带上 \x{3000} 和 \x{00a0} 一起清;或者先 mb_convert_kana 把全角空格转成半角再 trim;清洗放在入库前 别只依靠前端处理;把粘贴进来的真实昵称存成用例。
验收就看一点,同一个昵称提交后校验通过 列表里前后没有多余空白。
