2010-03-16 12 views
9

Esto es una especie de análogo de Java de this question about C#.¿Cómo convertirías un String a un literal de cadena Java?

Supongamos que tengo un objeto String que quiero representar en el código y quiero producir una cadena literal que se corresponda con la misma cosa.

Ejemplo

hello, "world" 
goodbye 

convierte

hello, \"world\"\ngoodbye 

Estaba a punto de escribir una máquina de estados que ingiere el carácter de la cadena de caracteres y se escapa apropiadamente, pero luego me preguntó si había una manera mejor , o una biblioteca que proporciona una función para hacer esto.

Respuesta

6

Si usted puede agregar código externo, de Apache Commons Lang tiene EscapeStringUtils.escapeJava() que creo que hace exactamente lo que quiere.

+1

el enlace ahora está roto :( – epeleg

+0

@epeleg: Gracias, corregido – unwind

+0

EscapeStringUtils.escapeJava() no hace citas externas, si la cadena no es nula. Tendría que envolverlo con: (s == nulo) ? null: "\" "+ StringEscapeUtils.escapeJava (s) +" \ ""; –

2

Mi aplicación máquina de estados ingenuo se ve así:

public String javaStringLiteral(String str) 
{ 
    StringBuilder sb = new StringBuilder("\""); 
    for (int i=0; i<str.length(); i++) 
    { 
     char c = str.charAt(i); 
     if (c == '\n') 
     { 
      sb.append("\\n"); 
     } 
     else if (c == '\r') 
     { 
      sb.append("\\r"); 
     } 
     else if (c == '"') 
     { 
      sb.append("\\\""); 
     } 
     else if (c == '\\') 
     { 
      sb.append("\\\\"); 
     } 
     else if (c < 0x20) 
     { 
      sb.append(String.format("\\%03o", (int)c)); 
     } 
     else if (c >= 0x80) 
     { 
      sb.append(String.format("\\u%04x", (int)c)); 
     } 
     else 
     {    
      sb.append(c); 
     } 
    } 
    sb.append("\""); 
    return sb.toString(); 
} 
+0

Olvidó el carácter de tabulación. – fernacolo

+0

Y la alimentación de formulario '\ f' y la tecla de retroceso '\ b'. –

Cuestiones relacionadas