2016-04-01 1 views
0

Мне нужно написать приложение, которое кулак преобразует строку в unicode, а затем добавляет 2 к значению unicode для создания новой строки.кодирование и декодирование строки

В принципе, если вход: пароль RhYxtz, то выход должен выглядеть следующим образом: rcuuyqtf ку TjAzvb

следующий код, что я до сих пор:

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

} 

Проблема заключается в том, что Я не знаю, как преобразовать unicode обратно в строку письма и как сохранить формат таким же, как и вход. Может ли кто-нибудь мне помочь? Благодарю.

+1

Строки в Java уже в Unicode. Вам не нужно делать никаких конверсий, особенно если все ваши персонажи находятся в диапазоне ASCII. – RealSkeptic

+0

кодирование и кодирование строки ??? или кодирование и декодирование строки. Вы можете использовать https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#String(byte[],%20java.nio.charset.Charset) – StackFlowed

ответ

0

Попробуйте это:

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

Добавляя ответы : вы можете манипулировать символами Unicode с помощью целых чисел, как и вы, но тип данных по-прежнему будет символом char, а не int. Также символ может быть добавлен в строку. ;-) – rafaelbattesti

+1

Выход будет rcuuyqtf "ku" Tj [zv | вместо rcuuyqtf ku TjAzvb. Есть ли способ сохранить пробелы и преобразовать y и z в a и b? – bt203

+0

@ bt203 Конечно, вы можете, но меня смущает то, что вы хотите, поскольку это не добавление 2. Чтобы сохранить пробелы, используйте оператор if и 'Character.isWhitespace()'. Чтобы иметь «циклическое переполнение» по y и z, используйте другой оператор if. –

0

Unicode кодовые точки могут быть собраны в Java 8, как:

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

или в цикле с codePointAt в более ранних версиях.

Java char (2 байта) - это UTF-16, а их значение int не всегда является символом Unicode aka point point.

0

Это должно работать для ASCII буквы США:

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

Это работает. Благодаря! – bt203

+0

Я должен, конечно, объявить 2 и 26 названных констант. Что-то вроде 'static final int alphabetLength = ('z' - 'a') + 1;' Пожалуйста, подумайте о том, чтобы отметить ответ как принятый/правильный/полезный, thx. :-) –