As partes de criação, manipulação dos tokens e manipulação com o DAO estão corretas, o problema está em inserir no banco. Os valores são inseridos fora do formado “UTF8” .
Abaico o erro no tomcat:
EFBFBD é o “BOM” (Byte Order Mark), em Unicode o código é \uFFFD.
Como isso não é relevante para seus dados (é um lixo que serve para distinguir, em um arquivo-texto, qual é a codificação usada - se é UTF-8, UTF-16 etc.), você pode tentar um “replace” que remova o caracter Unicode “\uFFFD” das suas strings antes de inserir no banco.
S
satangoss
entanglement:
EFBFBD é o "BOM" (Byte Order Mark), em Unicode o código é \uFFFD.
Como isso não é relevante para seus dados (é um lixo que serve para distinguir, em um arquivo-texto, qual é a codificação usada - se é UTF-8, UTF-16 etc.), você pode tentar um "replace" que remova o caracter Unicode "\uFFFD" das suas strings antes de inserir no banco.
Mas onde devo colocar esse "replace" ou "\uFFFD", no caso se retirar o caracter ele não vai inserir servios?
Abaixo coloco o Listener responsável por manipular arquivo para Upload.
publicvoidlistener(UploadEventevent)throwsException{SimpleDateFormatdf=newSimpleDateFormat("yyyy-MM-dd");UploadItemarquivo=event.getUploadItem();limparDados();try{BufferedReaderreader=newBufferedReader(newFileReader(arquivo.getFile()));Stringdados[]=newString[7];Stringlinha=reader.readLine();while(!linha.equalsIgnoreCase("")){StringTokenizerst=newStringTokenizer(linha,";");dados[0]=st.nextToken();dados[1]=st.nextToken();dados[2]=st.nextToken();dados[3]=st.nextToken();dados[4]=st.nextToken();dados[5]=st.nextToken();dados[6]=st.nextToken();StringnumeroOS=dados[1];DatedataAbertura=(Date)df.parse(dados[2]);DatedataEntrega=(Date)df.parse(dados[3]);floattamanhoPF=Float.parseFloat(dados[4]);floatpercentualErros=Float.parseFloat(dados[5]);Stringobs=dados[6];//Cria um Objeto OSOsos=newOs();os.setNumero_os(numeroOS);os.setNum_asc(getAscSelecionada());os.setData_abertura_os(dataAbertura);os.setTamanho_pf_os(tamanhoPF);os.setPerc_erros_os(percentualErros);os.setObs_os(obs);os.setStatus_os(0);//sempre será 0 - Abertoos.setDataEntrega_os(dataEntrega);//Inseri no Bancoinserir(os);linha=reader.readLine();}reader.close();}catch(Exceptionexcecao){logger.error("Erro ao tentar efetuar o Upload do Arquivo: "+arquivo.getFile(),excecao);}}
Abraços
E
entanglement
Boa pergunta. Veja qual dessas strings contém esse maldito caracter, remova-o e isso provavelmente não irá dar problemas.
S
satangoss
A string é a String obs = dados[6], mas não intendi, como assim remover?? mas dai o nome vai ser gravado no banco errado sem os acentos … ou sem nada na string?? é isso?
E
entanglement
Não; esse caracter não é um acento. É um BOM - procure por “Byte Order Marker” na Internet, por favor. Ele não serve para nada (e não deve ser inserido em um banco de dados); a única serventia desse caracter é aparecer na primeira posição de um arquivo-texto, para indicar á aplicação que está lendo esse arquivo-texto qual é a codificação.
Você pode, sem medo, fazer isto aqui:
String obs = dados[6].replaceAll ("\uFFFD", "");
S
satangoss
entanglement:
Não; esse caracter não é um acento. É um BOM - procure por “Byte Order Marker” na Internet, por favor. Ele não serve para nada (e não deve ser inserido em um banco de dados); a única serventia desse caracter é aparecer na primeira posição de um arquivo-texto, para indicar á aplicação que está lendo esse arquivo-texto qual é a codificação.
Você pode, sem medo, fazer isto aqui:
String obs = dados[6].replaceAll ("\uFFFD", "");
Deu certo entanglement, porém como imaginava, o replace “come” os caracteres com acento e insere errado no banco…
Existe alguma forma de resolver isso?
Não existe uma forma de inserir sem usar métodos de replace? ou seja com alguma mudança de alguma configuração de enconding etc.
E
entanglement
Isso não pode ocorrer. O que está ocorrendo, provavelmente, é que você está usando a forma errada de ler o arquivo-texto.
Troque:
BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
por
String encoding = "UTF-8"; // não sei se é isso - você pode tentar outros encodings, como "Windows-1252" ou "ISO-8859-1", até achar o correto
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream (arquivo.getFile()), encoding));
S
satangoss
entanglement:
satangoss:
Deu certo entanglement, porém como imaginava, o replace “come” os caracteres com acento e insere errado no banco…
Isso não pode ocorrer. O que está ocorrendo, provavelmente, é que você está usando a forma errada de ler o arquivo-texto.
Troque:
BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
por
String encoding = "UTF-8"; // não sei se é isso - você pode tentar outros encodings, como "Windows-1252" ou "ISO-8859-1", até achar o correto
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream (arquivo.getFile()), encoding));
vlw cara RESOLVIDO era mesmo isso só mudei a string encoding pra “ISO-8859-1” e ele pegou certinho vlw broder :).