【发布时间】:2010-03-09 01:48:12
【问题描述】:
我正在阅读 Java 中的源文件,但是当我打印它 (sysout) 时,转义字符不再转义。如何在 Java 中的字符串中转义 \n 和 \t 等字符?
【问题讨论】:
-
你能发布你当前的阅读和输出代码吗?
-
您在源文件中的阅读情况如何?你到底是如何打印它们的?根据您的描述,我不清楚转义序列在哪里转换为它们所代表的转义字符。
我正在阅读 Java 中的源文件,但是当我打印它 (sysout) 时,转义字符不再转义。如何在 Java 中的字符串中转义 \n 和 \t 等字符?
【问题讨论】:
您应该使用 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"
【讨论】:
这里的许多解决方案建议添加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 表示形式 - 它速度快、单次解析并且不会占用太多额外空间。
【讨论】:
' 作为字符串分隔符的另一种编程语言中使用(如Javascript)。
使用:
\\n 和 \\t
一些以反斜杠 (\) 开头的字符构成一个转义序列,对编译器具有特殊意义。因此,在您的情况下,\n 和 \t 被视为特殊(分别为换行符和制表符)。所以我们需要转义反斜杠以使n 和t 按字面意思对待。
【讨论】:
\n,我想以编程方式将其转换为\\n
StringEscapeUtils 适合字符串相关的操作
【讨论】:
给定String s,
s = s.replace("\\", "\\\\");
将所有\ 替换为\\。
【讨论】: