2016-04-01 17 views
0

Ich muss eine Anwendung schreiben, die zuerst eine Zeichenfolge in Unicode konvertiert und dann 2 zum Unicode-Wert hinzufügen, um eine neue Zeichenfolge zu erstellen.Codierung und Decodierung einer Zeichenfolge

Grundsätzlich, wenn die Eingabe: Passwort RhYxtz ist, dann sollte die Ausgabe wie folgt aussehen: rcuuyqtf ku TjAzvb

der folgende Code ist, was ich habe, so weit:

public static void main(String[] args){ 

    System.out.print ("Enter text: "); 
    Scanner scan = new Scanner(System.in); 
    String text = scan.nextLine(); 

    int length = text.length(); 

    for(int i = 0; i < length; i ++){ 
     char currentChar = text.charAt(i); 
     int currentChar2 = currentChar+2; 
     String s = String.format ("\\u%04x", currentChar2); 
     System.out.println ("Encoded message: " + s); 
    } 

} 

Das Problem ist, dass Ich weiß nicht, wie man den Unicode wieder in eine Buchstabenfolge umwandelt und wie man das Format gleich der Eingabe hält. Könnte mir jemand helfen? Vielen Dank.

+1

Strings in Java sind bereits in Unicode. Sie müssen keine Konvertierungen vornehmen, insbesondere dann nicht, wenn alle Ihre Zeichen im ASCII-Bereich liegen. – RealSkeptic

+0

Codierung und Codierung einer Zeichenfolge ??? oder Codieren und Decodieren einer Zeichenfolge. Sie können https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[],%20java.nio.charset.Charset) – StackFlowed

Antwort

0

Versuchen Sie folgendes:

public static String encryped(String s) { 
    int[] cps = s.codePoints() 
      .mapToInt((cp) -> cp + 2) 
      .toArray(); 
    return new String(cps, 0, cps.length); 
} 

oder in einer Schleife mit codePointAt in früheren Versionen:

import java.util.Scanner; 
public class Example { 
    public static void main(String[] args) { 
      System.out.print ("Enter text: "); 
      Scanner scan = new Scanner(System.in); 
      String text = scan.nextLine(); 
      int length = text.length(); 
      String s = ""; 

    for(int i = 0; i < length; i ++){ 
     char currentChar = text.charAt(i); 
     if (currentChar == ' '){ 
      s += currentChar; 
     } else { 
      s += (char) (currentChar + 2); 
     } 
    } 
      System.out.println ("Encoded message: " + s); 
    } 
} 
+0

hinzufügen, um die Antwort hinzuzufügen : Sie können Unicode-Zeichen mit Integern bearbeiten, wie Sie es taten, aber der Datentyp ist immer noch ein Zeichen, kein Int. Auch ein Char kann in einen String umgewandelt werden. ;-) – rafaelbattesti

+1

der Ausgang wird rcuuyqtf "ku" Tj [zv | anstelle von rcuuyqtf ku TjAzvb. Gibt es eine Möglichkeit, das Leerzeichen beizubehalten und y und z in a und b umzuwandeln? – bt203

+0

@ bt203 Natürlich können Sie, aber ich bin verwirrt über was Sie wollen, da dies nicht hinzufügen 2. Um Whitespace zu behalten, verwenden Sie eine if-Anweisung und 'Character.isWhitespace()'. Um "zyklischen Überlauf" auf y und z zu haben, verwenden Sie eine andere if-Anweisung. –

0

Unicode-Codepunkte können in Java 8 wie gesammelt werden.

Java-Zeichen (2 Bytes) sind UTF-16, und ihr int-Wert ist nicht immer ein Unicode-Symbol aka Codepunkt.

0

für US-ASCII-Buchstaben arbeiten Dies sollte:

StringBuilder buf = new StringBuilder(length); 

for(int i = 0; i < length; i ++){ 
    char currentChar = text.charAt(i); 
    if (currentChar < 128 && Character.isLetter(currentChar)) { 
     if (currentChar == 'y' || currentChar == 'z' 
       || currentChar == 'Y' || currentChar == 'Z') { 
      buf.append((char) (currentChar + 2 - 26)); 
     } else { 
      buf.append((char) (currentChar + 2)); 
     } 
    } else { 
     buf.append(currentChar); 
    } 
} 
System.out.println(buf.toString()); 
+0

Das funktioniert. Vielen Dank! – bt203

+0

Ich sollte natürlich die 2 und 26 benannten Konstanten deklarieren. Etwas wie 'static final int alphabetLength = (' z '-' a ') + 1; 'Bitte beachte das Markieren der Antwort als akzeptiert/richtig/hilfreich, thx. :-) –