in xstream/src/java/com/thoughtworks/xstream/io/xml/XmlFriendlyNameCoder.java [480:531]
private String encodeName(final String name) {
String s = escapeCache.get(name);
if (s == null) {
final int length = name.length();
// First, fast (common) case: nothing to escape
int i = 0;
for (; i < length; i++) {
final char c = name.charAt(i);
if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') {
break;
}
}
if (i == length) {
return name;
}
// Otherwise full processing
final StringBuffer result = new StringBuffer(length + 8);
// We know first N chars are safe
if (i > 0) {
result.append(name.substring(0, i));
}
for (; i < length; i++) {
final char c = name.charAt(i);
if (c == '$') {
result.append(dollarReplacement);
} else if (c == '_') {
result.append(escapeCharReplacement);
} else if (i == 0 && !isXmlNameStartChar(c) || i > 0 && !isXmlNameChar(c)) {
result.append(hexPrefix);
if (c < 16) {
result.append("000");
} else if (c < 256) {
result.append("00");
} else if (c < 4096) {
result.append("0");
}
result.append(Integer.toHexString(c));
} else {
result.append(c);
}
}
s = result.toString();
escapeCache.put(name, s);
}
return s;
}