如何将表示“特殊”字符的字符串转换为其字符表示形式

How to transform strings representing 'special' characters to their character representation

提问人:136 提问时间:9/1/2023 最后编辑:Basil Bourque136 更新时间:9/1/2023 访问量:100

问:

我想转换表示特殊非打印字符的双字符字符串,例如“\t”、“\n”、“\a”,...到他们的单字符表示中。有没有通用的方法可以做到这一点(通用,我的意思是将每个字符串显式翻译成每个字符的替代方法)?

理想行为(我的字符串是从文件中读取的。这只是一个例子):

String str = "\\t";
char c = toChar(str); // c now represents the tab character '\t'
Java 字符串 字符

评论

1赞 Nexevis 9/1/2023
你看过这个问题吗?如果您能够使用它,它似乎可以用 Apache Commons 方法覆盖您的情况。刚刚意识到这个问题真的很老,所以可能已经过时了。
0赞 Basil Bourque 9/1/2023
@Nexevis 该问题的答案已过时。没有一个使用 Java 15+ 中内置的新功能。有关详细信息,请参阅我的答案

答:

2赞 Diego Borba 9/1/2023 #1

您可以通过以下方式利用 Apache Commons 文本库中的 StringEscapeUtils 类来实现您的目标:

String str = "\\t";
String unescapedStr = StringEscapeUtils.unescapeJava(str);
char c = unescapedStr.charAt(0);

该方法将字符串中的转义序列转换为其对应的字符。在这种情况下,它将转换为制表符。StringEscapeUtils.unescapeJava\\t'\t'

请记住将 Apache Commons 文本库包含在项目的依赖项中!

但是,如果由于某种原因您不想/不能使用库,您可以这样做:toChar

public static char toChar(String str) {
    switch (str) {
    case "\\t":
        return '\t';
    case "\\b":
        return '\b';
    case "\\n":
        return '\n';
    case "\\r":
        return '\r';
    case "\\f":
        return '\f';
    case "\\'":
        return '\'';
    case "\\\"":
        return '\"';
    case "\\\\":
        return '\\';
    default:
        throw new IllegalArgumentException();
    }
}

评论

1赞 136 9/1/2023
StringEscapeUtils.unescapeJava似乎完成了这项工作!
1赞 Basil Bourque 9/1/2023
无需添加库。此功能现在内置于 Java 中。
1赞 VGR 9/1/2023 #2

String 类本身有一个 translateEscapes 方法,它执行以下操作:

String str = "\\t";
char c = str.translateEscapes().charAt(0);
4赞 Basil Bourque 9/1/2023 #3

tl;博士

在 Java 15+ 中:

    ( "\\" + "t" ).translateEscapes()  -->  TAB character
    ( "\\" + "n" ).translateEscapes()  -->  LINE FEED character
    ( "\\" + "s" ).translateEscapes()  -->  SPACE character
    …

String#translateEscapes

在 Java 15+ 中,使用 String#translateEscapes 方法。

自 Java 2 以来,该类型基本上被破坏了,自 Java 5 以来一直存在。养成改用码位整数和对象的习惯。charString

final String input = "\\" + "t";
final String TAB = input.translateEscapes ( );

转储到控制台。使用代码点检查每个字符串的实际内容。

System.out.println ( "input = " + input );
System.out.println ( "input code points = " + Arrays.toString ( input.codePoints ( ).toArray ( ) ) );
System.out.println ( "TAB code points = " + Arrays.toString ( TAB.codePoints ( ).toArray ( ) ) );

运行时,我们验证我们确实以两个字符的字符串、反斜杠和“t”开头。调用后,我们将该输入转换为代码点为 9 的单个 TAB 字符。

input = \t
input code points = [92, 116]
TAB code points = [9]