public static String normaliza(String linea){
        final int LENGTH = linea.length();
        if (LENGTH == 0) {
		return linea;
    }

        StringBuffer sb = null;

        int beg = 0; int a = 0;
        while (a < LENGTH) {
            //
            // Invariante: sb contiene a[0:beg[ con caracteres \n, \t, \r
            //
        
            // buscar '\'
            a = linea.indexOf('\\', a);
            if (a == -1 || a == LENGTH-1) {
                // 
                // el caracter '\' no se encuentra en linea[beg, LENGTH[ 
                // ...o es el ultimo caracter
                // 
            
                if (beg == 0) {
                    //evitamos copiar la linea al string buffer
                    return linea;
                }
                sb.append(linea.substring(beg, LENGTH));
                break;
            }

            if (sb == null) {
                sb = new StringBuffer(LENGTH);
            }
            //
            // linea[a] == '\' y linea[a+1] es eventualmente 'n', 'r', 't'
            //
            char c = linea.charAt(a+1);
            switch (c) {
                case 'n': 
                    sb.append(linea.substring(beg, a)).append('\n');
                    beg = a+2;
                    a = a+2;
                    break;
                case 't': 
                    sb.append(linea.substring(beg, a)).append('\t');
                    beg = a+2;
                    a = a+2;
                    break;
                case 'r': 
                    sb.append(linea.substring(beg, a)).append('\r');
                    beg = a+2;
                    a = a+2;
                    break;
                default:
                    a++;
            }
        }
        return sb.toString();
    }