Java中等价于Python的repr()是什么?

27 投票
9 回答
9685 浏览
提问于 2025-04-15 13:57

有没有一个Java的方法,功能和Python里的repr一样?比如,假设这个方法叫做repr,

"foo\n\tbar".repr()

它会返回

"foo\n\tbar"

而不是

foo
        bar

像toString那样。

9 个回答

6

使用来自StringEscapeUtils类的静态方法escapeJava,这个类属于Apache Commons Text库。

String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
6

Java没有类似于repr的功能,不过repr可以帮你解决这个问题。(顺便说一下:我就是repr的作者。)

10

在某些项目中,我使用以下这个辅助函数来实现类似于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();
    }
}

这个函数的主要优点是,它不像这里其他一些解决方案那样只过滤一小部分不可打印的字符(比如那些基于replace的方案),而是直接处理所有不可打印的ASCII字符。虽然有些地方可以写得更好,但它确实能完成它的工作……

需要注意的是,和Python的函数一样,这个函数会在字符串的两边加上引号。如果你不想要这个引号,就需要在while循环前后去掉append('"')的调用。

撰写回答