在 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、业务字符串清洗建议封装统一工具类,避免隐形字符导致数据异常