Alterar Caracteres da String - Ciframento de César

Olá Pessoal!
Estou com um problema para fazer um método que deve receber uma String e retornar outra criptografada pelo Ciframento de César usando chave 3.
Por exemplo:
a letra ‘c’ deve ser alterada para ‘f’;
a letra ‘a’ deve ser alterada pela letra ‘d’;
(código ascii + 3)

Tenho algumas saídas que são esperadas para realizar testes, e o método que fiz funciona para algumas, porém, outras estão retornando caracteres diferentes dos que são esperados:

Entrada: ”
Saída Esperada: —
Saída do método: †

Entrada: ’
Saída Esperada: •
Saída do Método: ’

Código:

 public static String ciframento(String palavra){

        String cifrada = "";
        int chave = 3;

        for(int i = 0; i < palavra.length(); i++){
            int cod = (int) palavra.charAt(i);
            cifrada = cifrada + (char) (cod + chave);
        }

        return cifrada;
    }

Alguém tem alguma ideia do que pode estar acontecendo?

Aparentemente seu código funciona, veja: https://ideone.com/TtASWJ

Não deu pra entender as entradas que deram errado, quais caracteres são esses? São as aspas ou foi erro de digitação? Acho que ficaria mais fácil se você colocasse a string inteira que deu problema. E não esqueça de formatar corretamente o código. Basta selecioná-lo e usar o botão </> do editor:


De qualquer forma, tem outra maneira - na minha opinião - mais simples. Basta obter o array de char da string, modificá-lo (somando 3 em todos os elementos) e criar a nova string a partir dele:

public static String ciframento(String palavra){
    char[] chars = palavra.toCharArray();
    int chave = 3;

    for(int i = 0; i < chars.length; i++){
    	chars[i] += chave;
    }

    return new String(chars);
}

Muito Obrigada pela dica! :smiley:

De acordo com a tabela seriam esses caracteres:

As aspas duplas (código 148) deveria retornar o traço (código 151)
E a citação a direita (código 146) deveria retornar o ponto (código 149)

Vou colocar a String inteira:
Entrada: Me vê se a panela da moça é de aço, Madalena Paes, e vem.”
Saída Esperada: Ph#yí#vh#d#sdqhod#gd#prêd#ì#gh#dêr/#Pdgdohqd#Sdhv/#h#yhp1—

Entrada: fale à Danissa!’
Saída Esperada: idoh#ã#Gdqlvvd$•

Tem certeza que essa tabela está certa?

Pois o caractere 148 não é aspas duplas, na verdade ele se chama “CANCEL CHARACTER”:

System.out.println(Character.getName(148)); // CANCEL CHARACTER

Quando você usa o HTML Entity &rdquo;, ele se torna o caractere “RIGHT DOUBLE QUOTATION MARK”, cujo código é 8221. Faça esse teste em JavaScript:

var p = document.createElement('p');
p.innerHTML = '&rdquo;';
console.log(p.innerText.codePointAt(0)); // 8221

E ao somar 3, o resultado é o caractere cujo código é 8224, que no caso é o “DAGGER” ().

O mesmo acontece com o &mdash;, cujo código é 8212 (“EM DASH”), ou seja, a diferença dele para as aspas nem é 3, não teria como um virar o outro mesmo.

1 curtida

Então é isso mesmo, fiz esse teste aqui e consegui ver o erro agora, eu estava em dúvida se esta tabela estava certa ou o se o problema era meu código.
Muito Obrigada!