Java 11 的 strip() 是处理跨语言 Unicode 空白符的首选方法,依据 Character.isWhitespace(c) 识别全角空格(u3000)、不间断空格(u00A0)、行分隔符(u2028u2029)等 25+ 类空白符,而 trim() 仅支持 ASCII 控制符,无法处理 u3000 等 Unicode 空格。
java 11 的 strip() 是处理跨语言 unicode 空白符的首选基础方法,它不依赖 ascii 边界,而是严格依据 character.iswhitespace(c) 判断——这意味着它能识别并清理中文全角空格(u3000)、日文空格、不间断空格(u00a0)、各种 unicode 格式空格(如 u2000–u200f、u2028、u2029)等共 25+ 类空白字符。
strip() 能处理哪些 Unicode 空白符
它覆盖所有被 Character.isWhitespace(int) 返回 true 的字符,包括:
- ASCII 空格与控制符:
' '、' '、' '、' '、'' - 全角空格:
u3000(中文/日文常用) - 各种“窄”“中”“宽”空格:
u2000–u200A、u202F、u205F - 行分隔符与段落分隔符:
u2028(LINE SEPARATOR)、u2029(PARAGRAPH SEPARATOR) - 不换行空格:
u00A0(NO-BREAK SPACE),常见于 HTML 或富文本导出
strip() 不能做什么,需额外注意
strip() 只作用于字符串首尾,对中间空格完全无影响;它也不处理 null —— 调用 null.strip() 会直接抛 NullPointerException。
- 若输入可能为
null,先做判空:str == null ? null : str.strip() - 若需同时清理中间冗余空格(如多个空格变一个),需组合
replaceAll("\s+", " "),但注意\s匹配范围略大于isWhitespace()(含部分控制字符),如需严格对齐语义,改用replaceAll("[\p{Z}\p{Cf}]", " ")配合预编译 Pattern - 若只需去头或去尾,优先用
stripLeading()或stripTrailing(),避免误删另一端合法空白(例如保留右对齐末尾空格)
实际多语言清理推荐组合
面对真实用户输入(如含中英文混排、复制粘贴自网页、OCR 输出),建议分层处理:
- 第一步:安全判空 + 首尾 Unicode 清理 →
Optional.ofNullable(str).map(String::strip).orElse("") - 第二步:压缩内部连续空白为单空格(保留单词间距)→
.replaceAll("\s+", " ").trim()(注意:此处trim()已非必需,但可兜底旧 JDK 兼容逻辑) - 第三步:如需剔除零宽度字符(如
u200B零宽空格),单独追加 →.replaceAll("[\p{Cf}]", "")
对比 trim() 为什么在国际化场景下会失效
trim() 仅检查字符码 ≤ U+0020(即 ASCII 控制符范围),而 u3000(全角空格)码值是 U+3000,远超该范围。所以:
-
"u3000Hello".trim()→ 结果仍是"u3000Hello" -
"u3000Hello".strip()→ 正确返回"Hello"
只要涉及中文、日文、阿拉伯语、印度语系等文字环境,strip() 就不是“升级选项”,而是必要选择。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











