Java equivalent of Python repr()?

后端 未结 9 1870
醉酒成梦
醉酒成梦 2020-12-18 18:18

Is there a Java method that works like Python\'s repr? For example, assuming the function were named repr,

\"foo\\n\\tbar\".repr()

would re

相关标签:
9条回答
  • 2020-12-18 19:10

    Java has no repr-Function, but repr has got you covered (Full disclosure: I am the author of repr).

    0 讨论(0)
  • 2020-12-18 19:11

    In some projects, I use the following helper function to accomplish something akin to Python's repr for strings:

    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();
        }
    }
    

    Its main advantage over many of the other solutions given here is, that it does not filter only a limited set of non-printable characters (like those replace-based solutions), but simply all non-printable ASCII characters. Some of it could have been written slightly nicer, but it actually does its job...

    Note, that like the Python function, this one will surround the string with quotes. If you do not want that, you will have to eliminate the append('"') calls before and after the while loop.

    0 讨论(0)
  • 2020-12-18 19:13

    Use the static method escapeJava from the StringEscapeUtils class in Apache Commons Text.

    String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
    
    0 讨论(0)
提交回复
热议问题