3

我有一个格式的字符串:

“aaa\\u2022bbb\\u2014ccc”

我想显示这两个特殊字符,但要做到这一点,我必须首先将字符串转换为这种格式:

“aaa\u2022bbb\u2014ccc”

我试过写这个,但它给出了一个编译错误:

String encodedInput = input.replace("\\u", "\u");

这必须是直截了当的,但我就是无法理解。有任何想法吗?

4

5 回答 5

4

不幸的是,我不知道某种评估。

    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();
于 2012-04-05T21:23:02.173 回答
3

除了逃避你的转义——正如其他人(例如barsju)所指出的——你还必须考虑到通常将\uNNNN符号转换为实际的Unicode字符是由Java编译器在编译时完成的。

因此,即使您解决了反斜杠转义问题,您也可能很难让实际的 Unicode 字符显示出来,因为您似乎是在运行时而不是在编译时操作字符串。

这个答案提供了一种\uNNNN用实际对应的 Unicode 字符替换运行时字符串中的转义序列的方法。请注意,该方法在错误处理、边界检查和意外输入方面留下了一些 TODO。

(编辑:我认为这里提供的基于正则表达式的解决方案,例如 dash1e 会比我链接的方法更好,因为它们在处理意外输入数据方面更加完善)。

于 2012-04-05T21:03:45.277 回答
2

尝试

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());
于 2012-04-05T20:58:36.060 回答
0

你需要逃脱你的逃脱:

System.out.println("aaa\\u2022bbb\\u2014ccc".replace("\\\\u", "\\u"));
于 2012-04-05T21:00:06.163 回答
0
String input = "aaa\\u2022bbb\\u2014ccc";
String korv = input.replace("\\\\u", "\\u");
System.out.println(korv);

=>

aaa\u2022bbb\u2014ccc

这是因为“\”是字符串中的特殊字符,所以你也需要引用它。“\” == “\”。

于 2012-04-05T21:00:19.020 回答