在 Java 开发中,我们经常需要对字符串做首尾空白清理,trim() 和 Java 11 提供的 strip() 已经能处理绝大多数空格、全角空格、换行、制表符等空白字符。
举例
但在实际业务里,经常会遇到一种肉眼看不见、但真实存在的 “隐藏字符”,比如你遇到的:
家具零售
// 在ava代码中的样子
System.out.println("\u200B家具零售");
字符串前面看似空无一物,trim() 和 strip() 都无法去除,长度却比正常文字更长,导致匹配、入库、判断为空全部异常。
问题根源
这类字符并不是空白,而是Unicode 隐形控制字符,最常见的有:
\u200B 零宽空格
\u200C 零宽不连字(你遇到的就是它)
\u200D 零宽连字
\uFEFF BOM 头
\u00AD 软连字符
解决方案
核心思路:先用正则批量移除所有隐形控制字符,再执行 strip() 清理正常空白。
/**
* 彻底清理字符串:
* 1. 移除所有零宽空格、隐形控制字符
* 2. 清理首尾所有空白(含全角空格)
*/
public static String cleanString(String str) {
if (str == null || str.isBlank()) {
return "";
}
// 移除常见隐形 Unicode 字符
String cleaned = str.replaceAll("[\\u200B\\u200C\\u200D\\uFEFF\\u00AD\\u2060]", "");
// 最后清理首尾空白
return cleaned.strip();
}
public static void main(String[] args) {
// 带隐形字符的字符串
String dirty = "家具零售";
String clean = cleanString(dirty);
System.out.println("原长度:" + dirty.length());
System.out.println("清理后长度:" + clean.length());
System.out.println("清理结果:[" + clean + "]");
}
输出结果:
原长度:5
清理后长度:4
清理结果:[家具零售]
总结
1、普通空格:trim() / strip() 即可
2、全角空格、不换行空格:优先使用 strip()
3、肉眼看不见的隐形字符:必须通过替换 Unicode 编码移除
4、业务字符串清洗建议封装统一工具类,避免隐形字符导致数据异常
打赏



当前共有 0 条评论