2024-09-28 22:21:04 发布
网友
有没有一个Java方法可以像Python的repr那样工作?例如,假设函数名为repr
"foo\n\tbar".repr()
会回来的
"foo\n\tbar"
不是
foo bar
就像toString一样。
使用Commons LangStringEscapeUtils类中的静态方法escapeJava。
StringEscapeUtils
escapeJava
String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
在一些项目中,我使用以下helper函数来完成类似于Python的字符串的repr的任务:
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函数一样,这个函数将用引号将字符串括起来。如果不需要,则必须在while循环前后消除append('“)调用。
Java没有repr函数,但是repr让您了解了(完全公开:我是repr的作者)。
使用Commons Lang
StringEscapeUtils
类中的静态方法escapeJava
。在一些项目中,我使用以下helper函数来完成类似于Python的字符串的repr的任务:
与本文给出的许多其他解决方案相比,它的主要优势在于,它不仅过滤有限的不可打印字符集(例如那些基于替换的解决方案),而且只过滤所有不可打印的ASCII字符。其中一些本可以写得稍微好一点,但实际上它完成了它的工作。。。
注意,与Python函数一样,这个函数将用引号将字符串括起来。如果不需要,则必须在while循环前后消除append('“)调用。
Java没有repr函数,但是repr让您了解了(完全公开:我是repr的作者)。
相关问题 更多 >
编程相关推荐