【问题标题】:How to replace \\u by \u in Java String如何在 Java 字符串中用 \u 替换 \\u
【发布时间】:2012-04-19 14:57:32
【问题描述】:

我有一个格式的字符串:

“aaa\\u2022bbb\\u2014ccc”

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

“aaa\u2022bbb\u2014ccc”

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

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

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

【问题讨论】:

  • 你试过replace("\\\\u", "\\u")吗?
  • @AmirPashazadeh:这是我尝试过的事情之一。似乎返回一个相同的字符串。
  • “格式 ...\uxxxx...”未定义。有许多不同的字符串文字格式使用\u 转义,所有的规则都略有不同。您必须知道您拥有哪些,​​才能正确解码它们。它是来自 Java 源代码的文字吗?是 JSON 吗?是别的吗?

标签: java string unicode unicode-string


【解决方案1】:

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

因此,即使您解决了反斜杠转义问题,您在显示实际 Unicode 字符时也可能会遇到更多麻烦,因为您似乎是在运行时而不是在编译时操作字符串。

This answer 提供了一种将运行时字符串中的\uNNNN 转义序列替换为实际对应的Unicode 字符的方法。请注意,该方法还有一些关于错误处理、边界检查和意外输入的 TODO。

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

【讨论】:

    【解决方案2】:

    不幸的是,我不知道某种 eval。

        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();
    

    【讨论】:

      【解决方案3】:

      试试

      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());
      

      【讨论】:

      • @dash1e 也许您想要Pattern unicode = Pattern.compile("\\\\\\\\u(.{4})");Matcher matcher = unicode.matcher("aaa\\\\u2022bbb\\\\u2014ccc");,那么我认为您可以在他的示例中处理双反斜杠:aaa\\u2022bbb\\u2014ccc。 (我认为他在字符串中确实存在双斜杠,因为它存在于内存中。他在示例字符串周围加上引号的事实当然令人困惑。)
      【解决方案4】:
      String input = "aaa\\u2022bbb\\u2014ccc";
      String korv = input.replace("\\\\u", "\\u");
      System.out.println(korv);
      

      =>

      aaa\u2022bbb\u2014ccc
      

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

      【讨论】:

        【解决方案5】:

        你需要逃脱你的逃脱:

        System.out.println("aaa\\u2022bbb\\u2014ccc".replace("\\\\u", "\\u"));
        

        【讨论】:

          猜你喜欢
          • 2018-10-03
          • 2021-03-28
          • 2016-11-04
          • 2012-11-24
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 2018-11-03
          相关资源
          最近更新 更多