是否有一种类似Python的repr的Java方法?例如,假设该函数名为repr,
"foo\n\tbar".repr()
将返回
"foo\n\tbar"
不
foo bar
asString。
答案 0 :(得分:8)
在某些项目中,我使用以下帮助函数来完成类似于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 循环之前和之后消除追加('“')调用。
答案 1 :(得分:5)
Java没有repr-Function,但repr已经涵盖了你(完全披露:我是repr的作者)。
答案 2 :(得分:3)
使用Commons Lang escapeJava
类的静态方法StringEscapeUtils
。
String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
答案 3 :(得分:1)
这样做会有所帮助,但它有点像黑客,它使用Common Lang中的StringUtils和 replaceEach 来实现简单的替换:
String hello = "hello\n\tworld\n\n\t";
String replaced = StringUtils.replaceEach(hello, new String[] {"\n", "\t", "\r", "\f"},
new String[] {"\\n", "\\t", "\\r", "\\f"});
System.out.println("Replaced " + replaced);
答案 4 :(得分:1)
不要认为有一个特定的方法 - 但这将解决它没有公共lang:
public class test {
public test() throws Exception {
byte[] hello = "hello\n\tworld\n\n\t".getBytes();
System.out.println(new String(hexToByte(stringToHex(hello).replaceAll("0a", "5c6e")
.replaceAll("09", "5c74"))));
}
public static void main(String[] args) throws Exception {
new test();
}
public static String stringToHex(byte[] b) throws Exception {
String result = "";
for (int i = 0; i < b.length; i++) {
result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
}
return result;
}
public static byte[] hexToByte(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));
}
return data;
}
}
答案 5 :(得分:0)
如果你只是在字符串上使用它,那么你可以编写一个遍历字符串的方法,用它们的转义代码替换特殊字符(对于你想要的“特殊”的任何定义)。这就是我要做的。 (我做了一个快速搜索,谷歌上没有任何内容,因此编写方法可能比寻找现有实现更快)
答案 6 :(得分:0)
如果有这样的方法,它会使用Java编写quines非常容易,因为它可以解决转义引号的问题。看作Java中最简单的quines都需要手动插入引号字符及其字符代码,这种方法不太可能存在。
答案 7 :(得分:0)
似乎Jython已经这样做了。理论上,您可以包含Jython jar,启动解释器,并在相关对象上实际运行repr(object)。可能比您想要的更多开销,但完全符合您的描述。
如果您想在应用程序中嵌入Jython解释器,请考虑http://wiki.python.org/jython/JythonFaq/EmbeddingJython。
答案 8 :(得分:0)
如果您使用 Groovy ,它提供与Apache Commons Lang类似的StringEscapeUtils
class:
StringEscapeUtils.escapeJava("foo\n\tbar")