【问题标题】:How to encode unicode characters like \u0022 and \u005c (\ and ") in a Java string?如何在 Java 字符串中编码 unicode 字符,如 \u0022 和 \u005c(\ 和“)?
【发布时间】:2021-06-01 03:26:21
【问题描述】:

我正在开发一个基于 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" 没有问题,并且可以提供正确的结果。

【问题讨论】:

  • 关于 Java 和 Unicode 的有用帖子:stackoverflow.com/questions/2533097/java-unicode-encoding
  • 双引号和反斜杠是唯一在字符串文字中表现特殊的字符。因此,它们的 Unicode 等价物 \u022\005c 是唯一也会表现特殊的 Unicode 转义。所以,问题解决了,我认为 (;-D)
  • 如果你可以像这样格式化,反斜杠(和其他 unicode 字符)应该打印正确:int test = 0x005c;System.out.println((char)test);

标签: java unicode


【解决方案1】:

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

String x = \u0022Hello\u0022;

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

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

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

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

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

【讨论】:

    【解决方案2】:

    这似乎是渗透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());
                    }
            );
    

    【讨论】:

      猜你喜欢
      • 2010-11-06
      • 1970-01-01
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-20
      • 2013-11-01
      相关资源
      最近更新 更多