Caracteres especiais

5 respostas
almarti

Recentemente precisei converter uma clase de cryptografia feita em Visual Basic para java. Embora iniciante em java, consegui fazer a conversão. O Que é criptogrado em VB eu consigo descriptografar em java. Mas nao consigo fazer o inverso. Detectei o seguinte problema:

Em VB, o char(133) = “,”

No Java, retorna “?”

Usei os seguintes métodos para trabalhar com caracteres:

private String AsciiToChar(int intValor)
	{
		String aChar = new Character((char)intValor).toString();
		return aChar;
	}
	
	private int CharToAscii(String strValor)
	{
		int i;
		char a[] = strValor.toCharArray();
		
		if (strValor.length()>0)
			i = (int) a[0];
		else
			i = 0;
		return i;
		
	}

Acredito que eu tenha que preparar o java para reconhecer carateres especiais, mas não sei como fazer isto.

Alguma dica?

5 Respostas

almarti

Alguem?

furutani

O VB não deve seguir a tabela ASCII por que segundo o site http://www.asciitable.com/, 133 não é virgula e sim 44.

almarti

Mas porque o java retornaria “?” se o 133 também não é “?” e sim “à”

O

Quando se trabalha com char e string, deve-se atentar ao charset utilizado. Veja no javadoc da classe String, como manipular String definindo o charset. Se o charset não é definido, a JVM utiliza o charset setado no seu sistema operacional. Use a opção -Dfile.encoding= para a JVM usar o charset que você quer.

T

133 é em hexadecimal 0x85, que deveria ser o caracter “…” do Windows. (Em Unicode: U+2026 = Horizontal Ellipsis)

O grande problema é que strings não são arrays de bytes, portanto se você gerou strings com conteúdo binário, vai ter bastantes problemas.

(De qualquer maneira, para não ser muito chato, experimente fazer o seguinte:

  • Pegue cada um dos bytes que foram gerados pela classe de criptografia
  • Use new String (bytes, “ISO-8859-1”) para gerar a tal string. Acho que não vai mais aparecer esse “?” mas mesmo assim você vai ter problemas na hora de decifrar os dados.

O correto, para evitar esses problemas, é sempre converter dados que foram criptografados para Base-64 ou hexadecimal. Isso elimina os caracteres que não são imprimíveis e ASCII (ou seja, abaixo de 32 ou acima de 126).

Criado 5 de dezembro de 2006
Ultima resposta 6 de dez. de 2006
Respostas 5
Participantes 4