【问题标题】:How do I escape a string in Java?如何在 Java 中转义字符串?
【发布时间】:2010-03-09 01:48:12
【问题描述】:

我正在阅读 Java 中的源文件,但是当我打印它 (sysout) 时,转义字符不再转义。如何在 Java 中的字符串中转义 \n\t 等字符?

【问题讨论】:

  • 你能发布你当前的阅读和输出代码吗?
  • 您在源文件中的阅读情况如何?你到底是如何打印它们的?根据您的描述,我不清楚转义序列在哪里转换为它们所代表的转义字符。

标签: java string escaping


【解决方案1】:

您应该使用 Apache Commons Text 中的 StringEscapeUtils 类(您也可以在 Apache Commons Lang3 中找到该类,但不推荐使用该类)。您会发现 Apache Commons 中还有许多其他产品可能有助于解决您在 Java 开发中遇到的其他问题,这样您就不会重新发明轮子。

您想要的特定调用与“Java 转义”有关; API 调用是StringEscapeUtils.escapeJava()。例如:

System.out.println(StringEscapeUtils.escapeJava("Hello\r\n\tW\"o\"rld\n"));

会打印出来:

Hello\r\n\tW\"o\"rld\n

该库中还有许多其他转义实用程序。您可以找到Apache Commons Text in Maven Central,然后将其添加到您的 Maven 项目中,如下所示:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-text</artifactId>
    <version>1.3</version>
</dependency>

如果您使用的是 Gradle:

compile "org.apache.commons:commons-text:1.3"

【讨论】:

    【解决方案2】:

    这里的许多解决方案建议添加Apache Commons Text 并使用StringEscapeUtils。这里的其他一些解决方案完全是错误的。

    一个可能的解决方案如下:

    /**
     * escape()
     *
     * Escape a give String to make it safe to be printed or stored.
     *
     * @param s The input String.
     * @return The output String.
     **/
    public static String escape(String s){
      return s.replace("\\", "\\\\")
              .replace("\t", "\\t")
              .replace("\b", "\\b")
              .replace("\n", "\\n")
              .replace("\r", "\\r")
              .replace("\f", "\\f")
              .replace("\'", "\\'")
              .replace("\"", "\\\"");
    }
    

    转义列表来自 Oracle 的list。 (注意 \\ 会先转义,因为您不想稍后再转义。)

    这个解决方案没有它可能的那么快,但它应该可以工作。理想情况下,您只需要解析一次 String 并且不需要继续重建您的 String 数组。对于小字符串,这应该没问题。

    如果您从存储数据的角度考虑这一点,还可以考虑将其转换为 Base64 表示形式 - 它速度快、单次解析并且不会占用太多额外空间。

    【讨论】:

    • .replace("\'", "\\'") 不是必需的。否则,感谢您提供这个有用的答案。
    • 我认为有必要。如果没有这个,像“\n”(反斜杠后跟“n”)这样的字符串将保持原样,目标系统会将其解释为换行符。
    • @Comencau 如果字符串应该在 Java 中使用,则没有必要,但如果字符串应该在支持' 作为字符串分隔符的另一种编程语言中使用(如Javascript)。
    【解决方案3】:

    使用:

    \\n\\t

    一些以反斜杠 (\) 开头的字符构成一个转义序列,对编译器具有特殊意义。因此,在您的情况下,\n\t 被视为特殊(分别为换行符和制表符)。所以我们需要转义反斜杠以使nt 按字面意思对待。

    【讨论】:

    • 我正在阅读的文件包含\n,我想以编程方式将其转换为\\n
    【解决方案4】:

    StringEscapeUtils 适合字符串相关的操作

    【讨论】:

      【解决方案5】:

      给定String s

      s = s.replace("\\", "\\\\");
      

      将所有\ 替换为\\

      【讨论】:

      • 这是错误的,因为 \n 被视为一个字符,所以不会发现 \ 被替换为 \\
      猜你喜欢
      • 2011-04-02
      • 2012-08-24
      • 2012-05-18
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多