String para byte[] perde formatação

9 respostas
C

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?

9 Respostas

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','');
J

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

getBytes("ISO-8859-1");
C

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!

sergiotaborda

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

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,'');
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é.

eliangela

vc pode usar esses caracteres em octal, assim:

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

[quote=KWill]

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é.

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

eliangela

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

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

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

[quote=eliangela]

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

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.

Criado 6 de novembro de 2009
Ultima resposta 6 de nov. de 2009
Respostas 9
Participantes 5