跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

Character.isISOControl处理变量不可见控制字符

Character.isISOControl() 判定为 true 的字符包括 ASCII 0x00–0x1F(32个控制符)和 DEL(0x7F),不包含 U+0080–U+009F(C1区),除非 JVM 启用特定兼容模式。 Java 中
Character.isISOControl()
是判断字符是否为 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 控制字符的区别
Character.isISOControl()
和 .NET 的
Char.IsControl()
不同:后者严格按 Unicode 标准识别
UnicodeCategory.Control
,涵盖 U+0000–U+001F、U+007F、U+0080–U+009F 全部范围;而 Java 的
isISOControl
默认只认前两段(即 0x00–0x1F 和 0x7F),对 C1 区(0x80–0x9F)返回 false ,除非底层 char 实际以 Latin-1 编码解释且 JVM 启用相关兼容模式。 实际清理字符串的推荐写法 若目标是剔除所有常见不可见控制字符(含部分 C1 字符),建议组合判断: 优先用
Character.isISOControl(c)
覆盖基础控制符 补充检查
Character.isWhitespace(c) && !Character.isSpaceChar(c)
排除零宽空格、字节顺序标记(BOM)、软连字符等 对已知风险字符(如 U+200B 零宽空格、U+FEFF BOM)做显式过滤 避免仅依赖
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
是因 LF、CR、HT 等虽属控制符,但常具排版意义;如需彻底清除所有不可见符,去掉
|| Character.isWhitespace(c)
即可。

相关文章