2010-06-14 4 views
1

Я читаю this question, и мне было интересно, есть ли способ рассмотреть весь диапазон символов? Например, «á», «é», «ö», «ñ», а не считать «» ([Пространство])? (Например, моя строка - «Hello World», а стандартный результат - «Khoor # Zruog», я хочу удалить это «#», поэтому результатом будет «KhoorZruog»)Caesar Cipher в Java (испанские символы)

Я уверен, что мой ответ есть в этом фрагменте кода:

if (c >= 32 && c <= 127) 
     { 
      // Change base to make life easier, and use an 
      // int explicitly to avoid worrying... cast later 
      int x = c - 32; 
      x = (x + shift) % 96; 
      chars[i] = (char) (x + 32); 
     } 

Но я пробовал некоторые вещи, и это не сработало.

+0

Определить "целый ряд". Я бы не стал рассматривать 'ö', но будет включать' ř' - очевидно, определение диапазона зависит от вас. – Piskvor

+0

Кроме того, ни «á», «é», «ö», ни «ñ» ​​не находятся где-либо * рядом * с ASCII 32-127; в зависимости от набора символов они могут быть где угодно. Как только вы оставите 26 основных латинских букв, набор символов не будет образовывать смежный диапазон в выбранной кодировке. – Piskvor

ответ

0

Пространство как код ASCII 32, который вы не отфильтровываете. Вы можете попробовать:

if (c >= 33 && c <= 127) 
    { 
     // Change base to make life easier, and use an 
     // int explicitly to avoid worrying... cast later 
     int x = c - 32; 
     x = (x + shift) % 96; 
     chars[i] = (char) (x + 32); 
    } 

Я только что изменил 32 с 33 в вашем if-clause, чтобы просто игнорировать пробелы.

0

Вы можете использовать это. Он проверит для вас, что данная значение int представляет собой литерал. Character

Так что ваша функция может выглядеть следующим образом:

if (Character.isLiteral(c)) 
{ 
    // Change base to make life easier, and use an 
    // int explicitly to avoid worrying... cast later 
    int x = c - Character.MIN_VALUE; 
    x = (x + shift) % Character.MAX_VALUE; 
    chars[i] = (char) (x + Character.MIN_VALUE); 
} 
1

Смотрите этот псевдокод - должно быть тривиальным осуществимыми:

// you need to define your own range, obviously - it's not at all obvious whether 
// e.g. "ź" should be included and that it should come after "z" 
array char_range = ['a','á','b','c','č', (...), 'z','ź','ž'] 
// the text to encode 
string plaintext = 'some text here' 
// this will contain encoded text 
stringbuilder ciphertext = '' 
// the classic Caesar Cipher shifts by 3 chars to the right 
// to decipher, reverse the sign 
int shift_by = 3 
// note: character != byte, esp. not in UTF-8 (1 char could be 1 or more bytes) 
for each character in plaintext 
    get character_position of character in char_range // e.g. "a" would return 0 
    if not in char_range // e.g. spaces and other non-letters 
     do nothing // drop character 
     // alternately, you can append it to ciphertext unmodified 
     continue with next character 
    add shift_by to character_position 
    if character_position > char_range.length 
     character_position modulo char_range.length 
    if character_position < 0 // useful for decoding 
     add char_range.length to character_position 
    get new_character at character_position 
    append new_character to ciphertext 
done 
+0

Конечно, в то время как это приятное упражнение, на самом деле это не криптография, т. Е. Никого не старше 5 лет, в течение 5 минут. – Piskvor