如何在 Java 字符串中对 \u0022 和 \u005c(\ 和 ")等 unicode 字符进行编码?

How to encode unicode characters like \u0022 and \u005c (\ and ") in a Java string?

我正在开发基于 Java 的 Android 应用程序,它使用自定义网络字体来显示不同的图标。为了使用图标,我创建了一个简单的 HashMap:

Map<Integer, String> iconMaß = new HashMap<String, String>() {
    {
        put("help", "\ue004");
        put("info", "\ue005");
        ...
        put("search", "\u0022");
        put("delete", "\u005c");
    }
};

这很好用,除了使用 "\u005c""\u0022" 是不可能的。 "\u0022"代表""\u005c"代表\。似乎编译器翻译了转义的 unicode 字符, "\" 当然不是有效字符串。但是,使用 "\u005c" does not work either, since now the first backslash escaped the second one and instead of having one unicode character I now get the string \u005c`(六个字符长)...

那么,如何正确转义unicode字符呢?

当然,我可以通过使用 \" 来解决这个具体问题。但是,我想确保问题也不会出现在其他字符上,我想知道如何正确转义 unicode 字符。

顺便说一句:在 Kotlin 中使用 "\u005c""\u0022" 没有问题并提供正确的结果。

\u in java 不是字符串转义。这是一个由解析器本身 直接提取的转义 。这是有效的 java:

String x = \u0022Hello\u0022;

原因很简单:有时,您编辑源文件,例如US-ASCII 或 ISO-8859-1,但您仍然想在源文件中放置一个 unicode 雪人,这是不可能的。

要在 java 字符串中添加反斜杠,只需 "\" 即可。对于报价,"\"" 就是您所需要的。如果您出于某种奇怪的原因坚持始终使用该数字,可以使用八进制转义符,但不要超过 255(因此您可以用这些来覆盖 ASCII 和位)。否则,构建它们。很容易。因此,要么:

put("delete", "\"");

put("delete", "" + (char) 0x5C);

Kotlin 做出了不同的决定,并或多或少地假定您在 UTF-8 中编辑源文件,句号。 Java 决定它是一座太过分的桥梁,不能仅仅颁布这条法令。可能与 java 的起源比 kotlin 的起源早大约 25 年这一事实有关。当时 UTF-8 是一个很酷的想法,而不是事实上的标准。

这看起来像透水的explaination

这种添加方式也有效

 Map<String, String> testMap = new HashMap<String, String>()
        {
            {
                put("help", "\ue004");
                put("info", "\ue005");
                put("search", "\u005c\u0022");
                put("delete", "\u005c\u005c");
            };
        };

        testMap.entrySet().forEach(
                entry -> {
                    System.out.println(entry.getKey() + entry.getValue());
                }
        );