Character.isISOControl() 判定为 true 的字符包括 ASCII 0x00–0x1F(32个控制符)和 DEL(0x7F),不包含 U+0080–U+009F(C1区),除非 JVM 启用特定兼容模式。
Java 中
是判断字符是否为 ISO 控制字符的标准方法,适用于识别常见不可见控制字符(如换行、回车、制表、退格、响铃等),但需注意其覆盖范围和边界情况。
哪些字符会被 isISOControl 判定为 true
该方法依据 ISO/IEC 6429(即传统 ASCII 控制字符集)定义,返回
true
的字符包括:
ASCII 码 0x00–0x1F(共 32 个):NULL、SOH、STX、ETX、EOT、ENQ、ACK、BEL、BS、HT、LF、VT、FF、CR、SO、SI、DLE、DC1–DC4、NAK、SYN、ETB、CAN、EM、SUB、ESC、FS、GS、RS、US
DEL(0x7F):虽然不是控制功能字符,但被 ISO 标准纳入控制字符集
不包含
Unicode 中的 U+0080–U+009F(C1 控制字符),除非运行时环境明确支持 ISO 8859-1 或指定了相应编码
与 Unicode 控制字符的区别
和 .NET 的
不同:后者严格按 Unicode 标准识别
,涵盖 U+0000–U+001F、U+007F、U+0080–U+009F 全部范围;而 Java 的
默认只认前两段(即 0x00–0x1F 和 0x7F),对 C1 区(0x80–0x9F)返回
false
,除非底层 char 实际以 Latin-1 编码解释且 JVM 启用相关兼容模式。
实际清理字符串的推荐写法
若目标是剔除所有常见不可见控制字符(含部分 C1 字符),建议组合判断:
优先用
覆盖基础控制符
补充检查
排除零宽空格、字节顺序标记(BOM)、软连字符等
对已知风险字符(如 U+200B 零宽空格、U+FEFF BOM)做显式过滤
避免仅依赖
,它只处理首尾空白,不清理中间控制符
简单示例:安全过滤不可见字符
以下代码保留可打印字符和常规空白(空格、制表、换行、回车),剔除其余控制符:
注意:这里保留
是因 LF、CR、HT 等虽属控制符,但常具排版意义;如需彻底清除所有不可见符,去掉
即可。
Character.isISOControl()Character.isISOControl()Char.IsControl()UnicodeCategory.ControlisISOControlCharacter.isISOControl(c)Character.isWhitespace(c) && !Character.isSpaceChar(c)String.trim()public static String removeControlChars(String s) {
if (s == null) return null;
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (!Character.isISOControl(c) || Character.isWhitespace(c)) {
sb.append(c);
}
}
return sb.toString();
}isWhitespace|| Character.isWhitespace(c)