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
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());
}
}
}
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”.
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)
[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)
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.