如何将一个字符串转换为Java字符串字面值?

12

这有点类似于C#的这个问题的Java版本。

假设我有一个String对象,我想在代码中表示它,并且我想生成一个字符串字面量,该字面量映射到相同的内容。

示例:

hello, "world"
goodbye

变成

hello, \"world\"\ngoodbye

我正打算编写一个状态机,对字符串进行逐个字符的读取,并进行适当的转义处理,但是我想知道是否有更好的方法或者提供此功能的库。

2个回答

10
如果您可以添加外部代码,Apache 的 Commons Text 库中有一个名为 StringEscapeUtils.escapeJava() 的方法,我认为正是您想要的。

3
EscapeStringUtils.escapeJava() 不会处理外部引号,如果字符串不为空。我需要用以下代码包装它:(s == null)? null : """+StringEscapeUtils.escapeJava(s)+"""; - Max Spring

4

我天真的状态机实现看起来像这样:

public String javaStringLiteral(String str)
{
    StringBuilder sb = new StringBuilder("\"");
    for (int i=0; i<str.length(); i++)
    {
        char c = str.charAt(i);
        if (c == '\n')
        {
            sb.append("\\n");
        }
        else if (c == '\r')
        {
            sb.append("\\r");
        }
        else if (c == '"')
        {
            sb.append("\\\"");
        }
        else if (c == '\\')
        {
            sb.append("\\\\");
        }
        else if (c < 0x20)
        {
            sb.append(String.format("\\%03o", (int)c));
        }
        else if (c >= 0x80)
        {
            sb.append(String.format("\\u%04x", (int)c));
        }
        else
        {               
            sb.append(c);
        }
    }
    sb.append("\"");
    return sb.toString();
}

1
你忘记了制表符。 - fernacolo
1
还有换页符 '\f' 和退格符 '\b'。 - Franz D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接