我有一个格式的字符串:
“aaa\\u2022bbb\\u2014ccc”
我想显示这两个特殊字符,但要做到这一点,我必须首先将字符串转换为这种格式:
“aaa\u2022bbb\u2014ccc”
我试过写这个,但它给出了一个编译错误:
String encodedInput = input.replace("\\u", "\u");
这必须是直截了当的,但我就是无法理解。有任何想法吗?
我有一个格式的字符串:
“aaa\\u2022bbb\\u2014ccc”
我想显示这两个特殊字符,但要做到这一点,我必须首先将字符串转换为这种格式:
“aaa\u2022bbb\u2014ccc”
我试过写这个,但它给出了一个编译错误:
String encodedInput = input.replace("\\u", "\u");
这必须是直截了当的,但我就是无法理解。有任何想法吗?
不幸的是,我不知道某种评估。
String s = "aaa\\u2022bbb\\u2014ccc";
StringBuffer buf = new StringBuffer();
Matcher m = Pattern.compile("\\\\u([0-9A-Fa-f]{4})").matcher(s);
while (m.find()) {
try {
int cp = Integer.parseInt(m.group(1), 16);
m.appendReplacement(buf, "");
buf.appendCodePoint(cp);
} catch (NumberFormatException e) {
}
}
m.appendTail(buf);
s = buf.toString();
除了逃避你的转义——正如其他人(例如barsju)所指出的——你还必须考虑到通常将\uNNNN
符号转换为实际的Unicode字符是由Java编译器在编译时完成的。
因此,即使您解决了反斜杠转义问题,您也可能很难让实际的 Unicode 字符显示出来,因为您似乎是在运行时而不是在编译时操作字符串。
这个答案提供了一种\uNNNN
用实际对应的 Unicode 字符替换运行时字符串中的转义序列的方法。请注意,该方法在错误处理、边界检查和意外输入方面留下了一些 TODO。
(编辑:我认为这里提供的基于正则表达式的解决方案,例如 dash1e 会比我链接的方法更好,因为它们在处理意外输入数据方面更加完善)。
尝试
Pattern unicode = Pattern.compile("\\\\u(.{4})");
Matcher matcher = unicode.matcher("aaa\\u2022bbb\\u2014ccc");
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
int code = Integer.parseInt(matcher.group(1), 16);
matcher.appendReplacement(sb, new String(Character.toChars(code)));
}
matcher.appendTail(sb);
System.out.println(sb.toString());
你需要逃脱你的逃脱:
System.out.println("aaa\\u2022bbb\\u2014ccc".replace("\\\\u", "\\u"));
String input = "aaa\\u2022bbb\\u2014ccc";
String korv = input.replace("\\\\u", "\\u");
System.out.println(korv);
=>
aaa\u2022bbb\u2014ccc
这是因为“\”是字符串中的特殊字符,所以你也需要引用它。“\” == “\”。