in log4j-api/src/main/java/org/apache/logging/log4j/util/StringBuilders.java [232:300]
public static void escapeJson(final StringBuilder toAppendTo, final int start) {
int escapeCount = 0;
for (int i = start; i < toAppendTo.length(); i++) {
final char c = toAppendTo.charAt(i);
switch (c) {
case '\b':
case '\t':
case '\f':
case '\n':
case '\r':
case '"':
case '\\':
escapeCount++;
break;
default:
if (Character.isISOControl(c)) {
escapeCount += 5;
}
}
}
final int lastChar = toAppendTo.length() - 1;
toAppendTo.setLength(toAppendTo.length() + escapeCount);
int lastPos = toAppendTo.length() - 1;
for (int i = lastChar; lastPos > i; i--) {
final char c = toAppendTo.charAt(i);
switch (c) {
case '\b':
lastPos = escapeAndDecrement(toAppendTo, lastPos, 'b');
break;
case '\t':
lastPos = escapeAndDecrement(toAppendTo, lastPos, 't');
break;
case '\f':
lastPos = escapeAndDecrement(toAppendTo, lastPos, 'f');
break;
case '\n':
lastPos = escapeAndDecrement(toAppendTo, lastPos, 'n');
break;
case '\r':
lastPos = escapeAndDecrement(toAppendTo, lastPos, 'r');
break;
case '"':
case '\\':
lastPos = escapeAndDecrement(toAppendTo, lastPos, c);
break;
default:
if (Character.isISOControl(c)) {
// all iso control characters are in U+00xx, JSON output format is "\\u00XX"
toAppendTo.setCharAt(lastPos--, Chars.getUpperCaseHex(c & 0xF));
toAppendTo.setCharAt(lastPos--, Chars.getUpperCaseHex((c & 0xF0) >> 4));
toAppendTo.setCharAt(lastPos--, '0');
toAppendTo.setCharAt(lastPos--, '0');
toAppendTo.setCharAt(lastPos--, 'u');
toAppendTo.setCharAt(lastPos--, '\\');
} else {
toAppendTo.setCharAt(lastPos, c);
lastPos--;
}
}
}
}