Quando eu abro o arquivo texto no java realmente existe um caracter inválido (daqueles que aparecem como um quadradinho), existe alguma maneira de eu retirar todos esses caracteres antes de gravar o arquivo no banco de dados?
no próprio arquivo, copia um dos inválidos…
e dá um localizar e substituir e pronto.
rafaelbtz
mas é que eu não acesso os arquivos, eles são enviados pelos usuários via WEB para o servidor.
De la eu leio os arquivos e gravo no Banco de Dados.
Não tem como eu saber quais caracters inválidos podem vir, por isso minha idéia era tirar todos os caracteres que não são UTF-8 para depois gravar no banco.
Sera que da pra fazer isso.
E
entanglement
Os arquivos são sempre texto?
rafaelbtz
Sim. Na verdade são XML’s SEMPRE.
Eu faço a conversão deles com Jaxb, lógico que da erro. Mas mesmo assim eu preciso gravar todo arquivo recebido em uma tabela de LOG. A coluna desta tabela é tipo String.
rafaelbtz
Ja pensei em trocar o tipo da coluna para Blob assim gravo o array de bytes. Mas o MALDITO dba num deixa.
E
entanglement
Eles são sempre XML e sempre em UTF-8 ou eles podem estar em alguma outra codificação (tipo Windows-1252)? (Pelo que você esta falando pode ser que esses tais arquivos XML possam ter sido criados “manualmente” - e nesse caso vai dar alguns problemitas mesmo)
Hebert_Coelho
Como o entanglement disse, verifique se o XML está em UTF-8.
Quando você receber o arquivo você terá que mandar um replace no código.
Ou então, pagar umas berejas para o DBA. Quem sabe né…
rafaelbtz
Ai é que ta eles realmente podem vir em outra codificação.
Mas ai vai dar problema de parser no JAXB e o sistema não vai prosseguir com o processamento. O que está totalmente certo, pois os clientes são obrigados a enviar em UTF-8;
O que acontece é que quando ocorre essa falha eu preciso gravar o arquivo recebido em um log (no banco de dados). E esse maldita coluna é texto e não BLOB.
Não existe um jeito nem que eu tenha que fazer alguma coisa assim:
for(inti=0; i < texto.length(); i++){if(!isUTF8Valido(texto.charAt(i)))//nãogravaessecaracter
}
Esse método isUTF8Valido(char) existe algum jeito de cria-lo, existe algum teste que eu possa fazer com o caracter para saber se é um UTF-8 válido?
rafaelbtz
jakefrog:
Como o entanglement disse, verifique se o XML está em UTF-8.
Como eu faço isso?
rafaelbtz
Esse é o erro do parser:
org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the element content of the document
O único jeito que eu achei de testar é validar se a mensagem de erro começa em “An invalid XML character”, mas fiquei com nojo de fazer isso.
rafaelbtz
Alguem sabe me dizer quais os bytes válidos para uma sequencia UTF-8.
Neste caso especifico eu estou testando se algum dos bytes da String é igual a 0x00
Mas eu gostaria de testar o intervalo que é válido. Mas não achei nada sobre isso no Google.
E
entanglement
Ah, só vou fazer um comentário. Por acaso o arquivo que o usuário pode subir pode ser muito grande, tão grande que não caiba numa coluna String do banco de dados? (Note que não conheço o PostgreSQL portanto não sei se existe ou não algum limite para isso). Se puder ser grande, então não vale a pena todo esse esforço, Ache um diretório onde você possa copiar esse arquivo errado, e ponha na tal coluna só o nome do arquivo.
rafaelbtz
O arquivo não pode ser grande não, tem uma validação pra isso.
Na verdade o arquivo não é enviado via upload existe um programa Swing que envia e ele valida.
Mas a ideia é boa gravar no HD direto.
Balena
usa regex, assim você consegue dizer oque é válido e o que é inválido.