This is sort of the Java analogue of this question about C#.
Suppose I have a String
object which I want to represent in code and I want to produce a string literal that maps to the same thing.
Example
hello, "world"
goodbye
becomes
hello, \"world\"\ngoodbye
I was just about to write a state machine that ingests the string character by character and escapes appropriately, but then I wondered if there was a better way, or a li开发者_运维百科brary that provides a function to do this.
If you can add external code, Apache's Commons Text has StringEscapeUtils.escapeJava()
which I think does exactly what you want.
My naive state machine implementation looks like this:
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();
}
精彩评论