String para byte[] perde formatação

Olá pessoal!

Leio uma determinada tabela do banco de dados. Porém ela vem com uns caracteres enstranhos de EOT (end of transmition). Para eliminar esses caracteres estranhos eu converto o String em byte[] e depois leio byte por byte e elimino os caracteres. O restante en apendo num stringbuffer.

O problema é que quando eu converto o string em byte o string perde a formatação. Tipo assim:

String doBanco = "Assist Técnica - OS 20094806014716 aberta em 04/11/2009. Status: SOLICITAÇÃO ";

Observe que no caso acima tenho um símbolo [EOT]. Preciso eliminá-lo.

byte[] b = doBanco.getBytes("UTF-8");

StringBuffer sb = new StringBuffer();
		
		for (int i = 0; i < b.length; i++) {
			if (((int)b[i] == 004) || ((int)b[i] == 003)) {
				sb.append("\n");
			} else {
				sb.append((char) b[i]);
			}
		}

O resultado do stringbuffer vem sem os caracteres estranhos, mas a acentuação fica com problemas, tipo:

System.out.println(sb.toString());
Assist T?cnica - OS 20094806014716 aberta em 
04/11/2009. Status: SOLICITA??O 

Alguém pode ajudar?

Nenhum caracter é estranho e caracter não é um byte.
Se quer remover caracteres remova caracteres, não bytes.

Precisa saber que caracter estamos falando,mas suponho que seja \n ou \r
Por via das duvidas remova ambos. Um jeito simples

texto = texto.replaceAll('\n','').replaceAll('\r','');

Deve ser a codificação que está usando. Use uma que reconheça caracteres latinos.

getBytes("ISO-8859-1");

Sérgio, não é "/n" nem "/r".

Tem uma máquina que armazena dados no banco de forma automática e gera símbolos ETX (end of text) e EOT (end of transmition) (veja http://www.asciitable.com/)
Se eu ler a tabela do banco, ele não consegue interpretar esses símbolos. Então gera caracteres estranhos.

Para pegar o número do caractere na tabela ascii eu preciso converter em byte. No meu caso o caractere ETX é 003 e EOT é 004.

Consegui resolver o problema de outra forma.

método que resolveu:


StringBuffer sb = new StringBuffer();
		
		while (s.length() > 0) {
			String tmp = s.substring(0, 1);
			byte[] b = tmp.getBytes();
			
			for (int i = 0; i < b.length; i++) {
				if (((int)b[i] == 004) || ((int)b[i] == 003)) {
					sb.append("\n");
					s = s.substring(1, s.length());
				} else {
					sb.append(s.substring(0, 1));
					s = s.substring(1, s.length());
				}
			}
		}

Onde s é a String que eu li do banco.

Mas valeu a intenção!

[quote=Cristiano Pires]Sérgio, não é "/n" nem "/r".
(…)
Mas valeu a intenção![/quote]

Vc não entendeu. Vc não pode utilizar os byte para procurar caracteres em java.
Se o caracter é o 3 e 4 ,use esses em vez de ‘\n’ assim

char EOT = 4;
char ETX = 3;

text = text.replaceAll(EOT,'').replaceAll(ETX,'');

[quote=sergiotaborda]Nenhum caracter é estranho e caracter não é um byte.
Se quer remover caracteres remova caracteres, não bytes.

Precisa saber que caracter estamos falando,mas suponho que seja \n ou \r
Por via das duvidas remova ambos. Um jeito simples

texto = texto.replaceAll('\n','').replaceAll('\r','');

Ei, recomendo cuidado aí nesse trecho de código. O método “replaceAll” da classe String tem como primeiro parâmetro uma expressão regular, então para buscar corretamente pelo caractere ‘\r’, bote “\r”, e no caso do ‘\n’, ponha “\n”.

Inté.

vc pode usar esses caracteres em octal, assim:

texto = texto.replaceAll("\003","").replaceAll("\004","");

[quote=KWill][quote=sergiotaborda]Nenhum caracter é estranho e caracter não é um byte.
Se quer remover caracteres remova caracteres, não bytes.

Precisa saber que caracter estamos falando,mas suponho que seja \n ou \r
Por via das duvidas remova ambos. Um jeito simples

texto = texto.replaceAll('\n','').replaceAll('\r','');

Ei, recomendo cuidado aí nesse trecho de código. O método “replaceAll” da classe String tem como primeiro parâmetro uma expressão regular, então para buscar corretamente pelo caractere ‘\r’, bote “\r”, e no caso do ‘\n’, ponha “\n”.

Inté.[/quote]

Na realidade o método é replace, não replaceAll e usa char, não string. Erro meu.
o objetivo é usar o método que substitui os caracteres directamente. Se uso de byte ou string

[quote=sergiotaborda]Na realidade o método é replace, não replaceAll e usa char, não string. Erro meu.
o objetivo é usar o método que substitui os caracteres directamente. Se uso de byte ou string[/quote]

O método replace usa tanto String como char…
public String replace(CharSequence target, CharSequence replacement)

texto = texto.replace("\003","").replace("\004","");

[quote=eliangela][quote=sergiotaborda]Na realidade o método é replace, não replaceAll e usa char, não string. Erro meu.
o objetivo é usar o método que substitui os caracteres directamente. Se uso de byte ou string[/quote]

O método replace usa tanto String como char…
public String replace(CharSequence target, CharSequence replacement)

texto = texto.replace("\003","").replace("\004","");

char não é um objeto e não pode ser aceito onde CharSequence é necessário.

Do javadoc

String replace(char oldChar, char newChar)
Returns a new string resulting from replacing all occurrences of oldChar in this string with newChar.
String replace(CharSequence target, CharSequence replacement)
Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.

Estou me referindo à primeira assinatura. Não ha porque usar String quando usar char resolve.