В некоторых проектах я использую следующую вспомогательную функцию для выполнения чего-то похожего на repr Python для строк:
private static final char CONTROL_LIMIT = ' ';
private static final char PRINTABLE_LIMIT = '\u007e';
private static final char[] HEX_DIGITS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
public static String toPrintableRepresentation(String source) {
if( source == null ) return null;
else {
final StringBuilder sb = new StringBuilder();
final int limit = source.length();
char[] hexbuf = null;
int pointer = 0;
sb.append('"');
while( pointer < limit ) {
int ch = source.charAt(pointer++);
switch( ch ) {
case '\0': sb.append("\\0"); break;
case '\t': sb.append("\\t"); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\"': sb.append("\\\""); break;
case '\\': sb.append("\\\\"); break;
default:
if( CONTROL_LIMIT <= ch && ch <= PRINTABLE_LIMIT ) sb.append((char)ch);
else {
sb.append("\\u");
if( hexbuf == null )
hexbuf = new char[4];
for( int offs = 4; offs > 0; ) {
hexbuf[--offs] = HEX_DIGITS[ch & 0xf];
ch >>>= 4;
}
sb.append(hexbuf, 0, 4);
}
}
}
return sb.append('"').toString();
}
}
Его главное преимущество перед многими другими решениями, приведенными здесь, состоит в том, что он не фильтрует только ограниченный набор непечатаемых символов (например, решения, основанные на замене ), но просто все не печатные символы ASCII. Некоторые из них могли бы быть написаны немного лучше, но на самом деле они делают свою работу ...
Обратите внимание: эта функция, подобно функции Python, будет окружать строку кавычками. Если вы этого не хотите, вам придется исключить вызовы append ('' ') до и после цикла while .