2016-05-11 12 views
0

ich eine Java-String habenWie aus ein Escape-Zeichen auszuschließen als Escape-Zeichen behandelt wird

String t = "Region S\u00FCdost SER"; 

wo \ u00FC ein Ersatz für das Unicode-Zeichen ist „ü“

Wenn ich eine neue hinzufügen Wenn ich char an die obige Zeichenfolge lege, würde ich immer noch wollen, dass meine untere Funktion anderen Zeichen außer dem aktuellen entweicht.

Zum Beispiel würde die folgende Funktion für die erneute Ausführung das Ergebnis als "Region S \\ u00FCdost SER" und "Region S \\\\ u00FCdost SER" bei nachfolgenden Iterationen zurückgeben.

Wie verhindern wir dies?

public static String escapeString(String str) 
    { 
     StringBuffer result = new StringBuffer(); 

     // char is 16 bits long and can hold an UTF-16 code   
     // i iterate on chars and not on code points 
     // i guess this will be enough until we need to support surrogate pairs 
     for (int i = 0; i < str.length(); i++) 
     { 
      char c = str.charAt(i); 
      switch (c) { 

      case '"': 
       result.append("\\\""); //$NON-NLS-1$ 
       break; 
      case '\b': 
       result.append("\\b"); //$NON-NLS-1$ 
       break; 
      case '\t': 
       result.append("\\t"); //$NON-NLS-1$ 
       break; 
      case '\n': 
       result.append("\\n"); //$NON-NLS-1$ 
       break; 
      case '\f': 
       result.append("\\f"); //$NON-NLS-1$ 
       break; 
      case '\r': 
       result.append("\\r"); //$NON-NLS-1$ 
       break; 
      case '\'': 
        result.append("\\'"); //$NON-NLS-1$ 

       break; 
      case '\\': 

       result.append("\\\\"); //$NON-NLS-1$ 

       break; 

      default: 
       if (c < 128) 
       { 
        //is ascii 
        result.append(c); 
       } 
       else 
       { 
        result.append(
          String.format("\\u%04X", (int) c)); //$NON-NLS-1$ 
       } 
      } 
     } 

     return result.toString(); 
    } 
} 
+1

Sie können nicht, Compiler vor der Erstellung von Binärdateien ändert alle Unicode-Notation '\ uXXXX' mit seinen richtigen Zeichen, so in Binärdateien' String t 'endet mit' ü', nicht '\ u00FC'. (Dies ist auch der Grund, warum wir einen Kommentar schreiben können wie '// \ u000a System.out.println (" Hallo ");' und hallo auf dem Bildschirm sehen) – Pshemo

+0

@Pshemo Vielleicht übergibt er die Zeichenfolge als eine Laufzeiteingabe – Hackerdarshi

+0

@Hackerdarshi Meine Annahme basiert auf "Ich habe eine Java-Zeichenfolge" String t = "Region S \ u00FCdost SER"; "". Wenn diese Zeichenfolge von einer externen Ressource stammt, die explizit die Zeichen "' '' '' '' '' '' 'restOfUnicode' 'sendet, dann sollte diese Frage erwähnt werden. – Pshemo

Antwort

0

können Sie tun:

case '\\': 
    if(str.charAt(i+1)!='u') 
     result.append("\\\\"); 
    else 
     result.append("\\"); 
break; 

dass \u immer eine Unicode-Zeichenfolge in der Zeichenfolge bezeichnen Unter der Annahme.

+0

Die Methode sieht niemals eine '\ uXXXX'-Sequenz, weil die ursprüngliche Zeichenkette vom Compiler entkoppelt wurde, daher ist die von der Methode gesehene Zeichenkette' 'Region Südost SER' '. – Andreas

+0

@Andreas Wie ich in einem Kommentar zu der Frage gesagt habe, "Vielleicht übergibt er die Zeichenfolge als Laufzeit-Eingabe" ... – Hackerdarshi

+0

Willst du immer einen Unicode bezeichnen? Ich hatte meine Lösung genau so, wie Sie es erwähnt haben. Gibt es einen saubereren Weg, um dieses Problem zu lösen? :) wenn nicht kann ich die 3 Zeichen nach \ u extrahieren, um zu prüfen, ob es ein decodierter Unicode zusätzlich zu dem ist, was du erwähnt hast? – Siva

0

Wenn Sie eine Java Stringliteral als "Region S\u00FCdost SER" schreiben, werden die Java-Compiler interpretieren, dass als String-Wert Region Südost SER, das ist es, was die escape() Methode sehen, wenn auf t genannt.

Wenn Sie die Zeichenfolge Region S\u00FCdost SER wollten, sollten Sie die \, d. H. "Region S\\u00FCdost SER" haben.

Wenn Sie weiterhin die escape()-Methode ausführen, glaube ich, dass Sie sehen, was Sie wollen.

String s = "Region S\u00FCdost SER"; 
System.out.println(s); // print original text 
for (int i = 0; i < 4; i++) { 
    s = escapeString(s); 
    System.out.println(s); 
} 

Ausgang:

Region Südost SER       <-- original text 
Region S\u00FCdost SER 
Region S\\u00FCdost SER 
Region S\\\\u00FCdost SER 
Region S\\\\\\\\u00FCdost SER 

Wenn Sie Eingabe in "He'd say: \"Bitte schön\"" ändern, erhalten Sie:

He'd say: "Bitte schön"      <-- original text 
He\'d say: \"Bitte sch\u00F6n\" 
He\\\'d say: \\\"Bitte sch\\u00F6n\\\" 
He\\\\\\\'d say: \\\\\\\"Bitte sch\\\\u00F6n\\\\\\\" 
He\\\\\\\\\\\\\\\'d say: \\\\\\\\\\\\\\\"Bitte sch\\\\\\\\u00F6n\\\\\\\\\\\\\\\" 

ich meine, das ist, was Sie wollten, nicht wahr? Wenn nicht, bitte klären Sie die Frage, indem Sie die Beispielausgabe von dem, was Sie wollen, zeigen.

+0

Okay. Meine Frage besteht eher darin, das Hinzufügen zusätzlicher Escapes in der String-Eingabe zu verhindern, wie Sie es bei der Eingabeänderung erwähnt haben. Wie kann dies programmatisch verhindert werden? – Siva

+0

Ich weiß nicht, was Sie mit * "verhindern die Zugabe von zusätzlichen Escapes" *. Wenn die Zeichenkette ein '' '' ''enthält und die Methode die Zeichenkette verlassen soll, wird * jedes *' '' '' '\'' ''. Das bedeutet, dass 3 '' '' '6' '' '' 'wird. Das ist die Art, wie es funktionieren soll, also führt das doppelte und dreifache Entkommen eines Strings zu vielen Backslashes. – Andreas