String.strip() 不能去掉全角空格(U+3000),仅处理Unicode标准空白字符;需用正则如replaceAll("^[u3000s]+|[u3000s]+$", "")配合strip()才能安全兼容中英文混合输入。

String.strip() 能不能去掉全角空格?
不能。String.strip() 只识别 Unicode 标准中的 whitespace characters,全角空格(U+3000)不在其中,它会被原样保留。
常见错误现象:" hello ".strip()(首尾是全角空格)返回的仍是 " hello ",没变化。
使用场景:Java 11+ 环境下清理用户输入、日志行首尾空白时,若输入含中文输入法产生的空格,strip() 就会失效。
- 半角空格(U+0020)、制表符(U+0009)、换行符等:✅
strip()能处理 - 全角空格(U+3000)、全角制表(U+3000 类似变体)、中文顿号或破折号开头的“伪空白”:❌ 不处理
- 如果需兼容中英文混合输入,不能只靠
strip()
怎么安全地同时去掉全角和半角空格?
最直接的做法是用正则预处理:先替换全角空白为普通空格,再用 strip() 或 trim() 收尾。但注意别用 replaceAll("\s+", " ") 这种——它不匹配 U+3000。
立即学习“Java免费学习笔记(深入)”;
实操建议:
- 用
replaceAll("[\u3000\s]+", " ")替换所有全角空格(U+3000)和标准空白为单个半角空格,再strip() - 更严谨一点,如果只要“去首尾”,别动中间:用
replaceAll("^[\u3000\s]+|[\u3000\s]+$", "") - 性能提示:正则比原生
strip()慢,高频调用(如日志解析)建议提前编译Pattern,避免重复解析
示例:" hello
".replaceAll("^[\u3000\s]+|[\u3000\s]+$", "") → "hello"
strip() 和 trim() 在处理半角空格时有啥区别?
strip() 是 Java 11 新增的,比 trim() 更严格也更 Unicode 友好;trim() 只判断 char 值 ≤ U+0020(即 ASCII 控制字符),漏掉不少现代 Unicode 空白(比如 U+2000–U+200F 区间的空格)。
所以即使只处理半角场景,也推荐用 strip():
-
"u2001hellou2001".strip()→"hello"(U+2001 是英文空格的一种) -
"u2001hellou2001".trim()→"u2001hellou2001"(原样返回) - 但两者都对 U+3000 全角空格无感
要不要自己写工具方法统一处理?
要看调用频次和团队规范。如果项目里多处要处理中英文混合空白,封装一个 stripFullWidthAndNormal() 是值得的;但如果只是零星几处,加一行正则更轻量。
容易被忽略的点:
- 全角空格不是唯一“隐身空白”——还有全角制表(U+3000 同码位有时被误用)、IDEOGRAPHIC SPACE 的各种变体,甚至某些字体渲染导致的“看起来像空格”的零宽字符
- 前端传来的字符串可能还混着
u00A0(不间断空格),它属于strip()能处理的范围,但trim()不能 - 测试时务必用真实输入:复制粘贴中文输入法打出的空格,别手敲
" "—— 那只是半角
事情说清了就结束










