本文介绍如何将字符串中每个字符(无论是否为 ASCII 或特殊符号)强制转义为标准的 uXXXX Unicode 形式,解决 StringEscapeUtils.escapeJava() 对括号等常见 ASCII 字符不转义的问题。
本文介绍如何将字符串中**每个字符**(无论是否为 ascii 或特殊符号)强制转义为标准的 `uxxxx` unicode 形式,解决 `stringescapeutils.escapejava()` 对括号等常见 ascii 字符不转义的问题。
StringEscapeUtils.escapeJava() 是 Apache Commons Text 提供的便捷工具,但它遵循 Java 字符串字面量的“最小转义原则”:仅对非打印字符、控制字符及必要分隔符(如双引号、反斜杠)进行转义,而像 (、)、.、a-z、0-9 等可安全直接显示的 ASCII 字符则保持原样——这正是你观察到 (안녕하세요.) 中括号未被转义的根本原因。
若需强制统一转义所有字符(即实现“全 Unicode 转义”),应绕过语义感知型工具,采用底层字符遍历方式。推荐使用 Java 8+ 的 Stream API 实现简洁可靠的转换:
import java.util.stream.Collectors;
public class UnicodeEscaper {
public static String toUnicodeEscape(String str) {
if (str == null) return null;
return str.chars()
.mapToObj(c -> String.format("\u%04x", c))
.collect(Collectors.joining());
}
// 使用示例
public static void main(String[] args) {
String str = "(안녕하세요.)";
System.out.println(toUnicodeEscape(str));
// 输出:u0028uac00ub155ud558uc138uc694u002eu0029
}
}
⚠️ 注意事项:
- String.format("\u%04x", c) 中 %04x 确保输出为小写、4位十六进制(如 0028),符合 Java Unicode 转义规范;如需大写,可用 %04X。
- 该方法对 BMP(基本多文种平面)外的增补字符(如某些 emoji)会按 char 值处理,若需正确支持代理对(surrogate pairs),应改用 codePoints() 替代 chars():
str.codePoints() .mapToObj(cp -> String.format("\u%04x", cp)) .collect(Collectors.joining());(但注意:cp > 0xFFFF 时 %04x 会截断,更健壮的做法是判断范围并拼接代理对,或使用 Character.toChars(cp) 后逐 char 处理。)
总结:StringEscapeUtils.escapeJava() 的设计目标是生成可读、合法、最小化的 Java 字符串字面量,而非“全转义”。当业务明确要求所有字符以 uXXXX 表示(例如用于配置文件标准化、跨语言兼容或调试诊断),应采用手动字符映射方案——简洁、可控、无依赖。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











