Character.isWhitespace()仅识别标准空白字符(如空格、制表符、换行符等),不识别大多数控制字符(如\u0000–\u0008、\u000B、\u000C、\u000E–\u001F、\u007F等);检测肉眼不可见字符应使用Character.getType()判断CONTROL、FORMAT等类别。
character.iswhitespace() 只能识别标准的“空白字符”(如空格、制表符、换行符等),**不能识别大多数控制字符**(如 \u0000 到 \u0008、\u000b、\u000c、\u000e–\u001f、\u007f 等)。它不是用来检测“肉眼不可见的控制字符”的通用工具。
Character.isWhitespace() 实际覆盖的字符范围
该方法返回 true 的字符是 Java 规范中明确定义的“Unicode 空白字符”,主要包括:
- 空格(
' ',U+0020) - 水平制表符(
'\t',U+0009) - 换行符(
'\n',U+000A) - 回车符(
'\r',U+000D) - 换页符(
'\f',U+000C) - Unicode 中其他被归类为
SPACE_SEPARATOR的字符(如不换行空格\u00A0、全角空格\u3000等)
注意:\u0000(NULL)、\u0001–\u0008(SOH–BS)、\u000B(VT)、\u000E–\u001F(SO–US)、\u007F(DEL)等——这些常见控制字符 均不被 isWhitespace() 认为是空白,调用结果为 false。
如何真正检测肉眼不可见的控制字符
若目标是发现所有“不可见且非打印”的字符(即控制字符 + 格式字符 + 私有区字符等),应结合 Unicode 类别判断。推荐使用 Character.getType():
-
Character.CONTROL:典型控制字符(如\u0000,\u0007,\u001B) -
Character.FORMAT:格式控制符(如\u200E零宽左至右标记、\uFEFFBOM) -
Character.UNASSIGNED或Character.PRIVATE_USE:部分不可见或无显示定义的码位
示例代码:
立即学习“Java免费学习笔记(深入)”;
public static boolean isNonPrintable(char c) {
int type = Character.getType(c);
return type == Character.CONTROL ||
type == Character.FORMAT ||
type == Character.UNASSIGNED ||
type == Character.PRIVATE_USE;
}
实用排查建议:打印不可见字符的十六进制值
仅靠肉眼无法确认文本是否含隐藏字符。调试时可遍历字符串并输出每个字符的 Unicode 码点:
String s = "hello\u0000world"; // 含 NULL
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
System.out.printf("pos %d: '%c' (U+%04X)%n", i, c, (int) c);
}
输出类似:pos 5: '' (U+0000)
这样能直观定位异常码点。
补充说明:isISOControl() 更精准但有局限
Java 7+ 提供了 Character.isISOControl(int),它严格按 ISO/IEC 6429 标准识别 C0/C1 控制字符(U+0000–U+001F 和 U+007F–U+009F),比 isWhitespace() 覆盖更广的控制字符,但仍不包括零宽字符、BOM、方向标记等现代 Unicode 控制符。如需全面检测,仍建议用 getType() 组合判断。


















