<p>在一些项目中,我使用以下helper函数来完成类似于Python的字符串的<em>repr</em>的任务:</p>
<pre><code>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();
}
}
</code></pre>
<p>与本文给出的许多其他解决方案相比,它的主要优势在于,它不仅过滤有限的不可打印字符集(例如那些基于<em>替换</em>的解决方案),而且只过滤所有不可打印的ASCII字符。其中一些本可以写得稍微好一点,但实际上它完成了它的工作。。。</p>
<p>注意,与Python函数一样,这个函数将用引号将字符串括起来。如果不需要,则必须在<em>while</em>循环前后消除<em>append('“)</em>调用。</p>