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

And*_*ord 0 java unicode

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

\n
Map<Integer, String> iconMa\xc3\x9f = new HashMap<String, String>() {\n    {\n        put("help", "\\ue004");\n        put("info", "\\ue005");\n        ...\n        put("search", "\\u0022");\n        put("delete", "\\u005c");\n    }\n};\n
Run Code Online (Sandbox Code Playgroud)\n

这工作得很好,除了不可能使用"\\u005c"and 。代表且是。编译器似乎翻译了转义的 unicode 字符,当然它不是有效的字符串。但是,使用\\u005c` (六个字符长)..."\\u0022""\\u0022"""\\u005c"\\"\\""\\\\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

\n

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

\n

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

\n

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

\n

rzw*_*oot 6

\u在java中不是字符串转义。这是由解析器本身直接拾取的转义。这是有效的java:

String x = \u0022Hello\u0022;
Run Code Online (Sandbox Code Playgroud)

原因相当简单:有时,您使用 US-ASCII 或 ISO-8859-1 等格式编辑源文件,但您仍然想在源文件中放入 Unicode 雪人等内容,而这是不可能的。

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

put("delete", "\"");
Run Code Online (Sandbox Code Playgroud)

或者

put("delete", "" + (char) 0x5C);
Run Code Online (Sandbox Code Playgroud)

Kotlin 做出了不同的决定,并且或多或少假设您使用 UTF-8 编辑源文件,就这样。Java 认为它是一座太过遥远的桥梁,无法仅仅颁布这一法令。可能与java的起源比kotlin早大约25年有关。当时 UTF-8 是一个非常酷的想法,而不是事实上的标准。