Ответ 1
Если вы можете добавить внешний код, у Apache Commons Lang есть StringEscapeUtils.escapeJava()
который, я думаю, делает именно то, что вы хотите.
Это своего рода Java-аналог этого вопроса о С#.
Предположим, что у меня есть объект String
, который я хочу представить в коде, и я хочу создать строковый литерал, который отображает одно и то же.
Пример
hello, "world"
goodbye
становится
hello, \"world\"\ngoodbye
Я как раз собирался написать машину состояний, которая глотает строковый символ по символу и ускользает соответствующим образом, но потом я задавался вопросом, есть ли лучший способ или библиотека, которая предоставляет функцию для этого.
Если вы можете добавить внешний код, у Apache Commons Lang есть StringEscapeUtils.escapeJava()
который, я думаю, делает именно то, что вы хотите.
Моя реализация наивного состояния машины выглядит следующим образом:
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();
}