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:部分不可见或无显示定义的码位
示例代码:
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 <p>输出类似:<br><code>pos 5: '' (U+0000)</code><br> 这样能直观定位异常码点。</p> <h3>补充说明:isISOControl() 更精准但有局限</h3> <p>Java 7+ 提供了 <code>Character.isISOControl(int)</code>,它严格按 ISO/IEC 6429 标准识别 C0/C1 控制字符(U+0000–U+001F 和 U+007F–U+009F),比 <code>isWhitespace()</code> 覆盖更广的控制字符,但仍不包括零宽字符、BOM、方向标记等现代 Unicode 控制符。如需全面检测,仍建议用 <code>getType()</code> 组合判断。</p>
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











