string.strip() 能清除全角空格(u+3000)等 unicode 空白符,而 trim() 仅处理码点 ≤ u+0020 的字符,无法识别 u+3000、u+200b、u+00a0、u+2028、u+2029 等常见 unicode 空白。

String.strip() 在处理 Unicode 全角空白符时,确实比 trim() 更可靠——它不是“稍好一点”,而是根本性地解决了 trim() 的能力盲区。
全角空格(U+3000)是 trim() 完全无视的“隐形字符”
trim() 只检查字符码点是否 ≤ U+0020(即 ASCII 控制符和空格),而全角空格 U+3000 的码点是 12288,远超这个范围。所以无论你复制粘贴多少个中文空格,trim() 都会原封不动保留。
- 例如:
" hello "(首尾是全角空格)→.trim()结果仍是" hello " - 但
.strip()会识别 U+3000 属于 Unicode 的 Zs(Separator, Space) 类别,直接清除
strip() 覆盖真实用户输入中高频出现的 Unicode 空白
用户从网页、微信、富文本编辑器、PDF 复制的文本,常混入这些 trim() 无法处理的字符:
-
零宽空格(U+200B):粘贴后看似正常,但
equals()失败、数据库唯一索引冲突 - 不间断空格(U+00A0):常见于网页 HTML 实体 ,trim() 当作普通字符
- 行分隔符(U+2028)、段落分隔符(U+2029):某些编辑器导出内容含此类换行,trim() 不清理
底层机制决定结果差异
trim() 是硬编码比较:逐字符判断 c ;strip() 调用 <code>Character.isWhitespace(int),该方法严格遵循 Unicode 标准,覆盖全部 Zs、Zl、Zp 三类空白字符(共数十种)。
- 这意味着 strip() 不仅能处理中文全角空格,还能应对日文、阿拉伯语排版中的特殊空白
- 它不依赖“看起来像空格”,而是依据 Unicode 官方定义做语义判断
使用建议很直接
只要你的应用涉及用户输入、多语言内容或外部数据源,且运行在 JDK 11+ 环境下,就该把 .trim() 替换为 .strip()。
- 无需改逻辑,方法签名完全兼容(返回 String,无异常)
- 若需更精细控制,可用
.stripLeading()或.stripTrailing() - 老版本 JDK 可用正则替代:
str.replaceAll("(?U)^\s+|\s+$", "")(注意(?U)启用 Unicode 模式)










