Erro na importação de arquivos "UTF8" "LATIN1" (RESOLVIDO)

8 respostas
satangoss

Olá pessoal tenho uma rotina de importação de arquivos, ele ta importando um arquivo do tipo csv do seguinte formato:

OS;[telefone removido];2010-06-15;2010-07-15;58;0.0;Serviços referentes ao Pacote 1 dos Cadastros de Clientes;
OS;[telefone removido];2010-06-14;2010-07-14;70;0.0;Serviços referentes ao Pacote 2 dos Cadastros de Clientes;
OS;[telefone removido];2010-06-13;2010-07-13;60;0.0;Serviços referentes ao Pacote 3 Cadastros de Fornecedores;
OS;[telefone removido];2010-06-12;2010-07-12;61;0.0;Serviços referentes ao Pacote 4 dos Cadastros de Clientes;

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:

dados[0] : OS
dados[1] : [telefone removido]
dados[2] : 2010-06-14
dados[3] : 2010-07-14
dados[4] : 70
dados[5] : 0.0
dados[6] : Servi�os referentes ao Pacote 2 dos Cadastros de Clientes
14:44:43,180 ERROR [Sicff               ] Erro ao inserir OS: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "LATIN1"

Alguma ideia de como resolver?
Abraços

8 Respostas

E

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.

satangoss
entanglement:
EFBFBD é o "BOM" (Byte Order Mark), em Unicode o código é \uFFFD.

http://www.fileformat.info/info/unicode/char/fffd/index.htm

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.

public void listener(UploadEvent event) throws Exception {

        SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        UploadItem arquivo = event.getUploadItem();

        limparDados();

        try {
            BufferedReader reader = new BufferedReader(new FileReader(arquivo.getFile()));
            String dados[] = new String[7];
            String linha = reader.readLine();

            while (!linha.equalsIgnoreCase("")) {
                StringTokenizer st = new StringTokenizer(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();

                String numeroOS = dados[1];
                Date dataAbertura = (Date) df.parse(dados[2]);
                Date dataEntrega = (Date) df.parse(dados[3]);
                float tamanhoPF = Float.parseFloat(dados[4]);
                float percentualErros = Float.parseFloat(dados[5]);
               
                String obs =  dados[6];

                //Cria um Objeto OS
                Os os = new Os();
                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 - Aberto
                os.setDataEntrega_os(dataEntrega);

                //Inseri no Banco
                inserir(os);

                linha = reader.readLine();
            }

            reader.close();

        } catch (Exception excecao) {
            logger.error("Erro ao tentar efetuar o Upload do Arquivo: " + arquivo.getFile(), excecao);
        }

    }

Abraços

E

Boa pergunta. Veja qual dessas strings contém esse maldito caracter, remova-o e isso provavelmente não irá dar problemas.

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

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", "");
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

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));
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 :).

Criado 26 de julho de 2010
Ultima resposta 27 de jul. de 2010
Respostas 8
Participantes 2