Conversão de arquivos ANSI para UTF-8

Oi pessoal, estou tendo um probleminha, espero que alguém possa me ajudar…

Eu tenho alguns arquivos xml que estão em formato ANSI, só que quando vou fazer um parse para ler estes arquivos ele emite a seguinte exceção : Invalid byte 2 of 3-byte UTF-8 sequence. , pois bem, se eu modifico no editor de texto para UTF-8 ele funciona normalmente… gostaria de saber como faço isso através de codificação.

Espero que possam me ajudar. Desde já agradeço.

Os seus arquivos XML estão errados, obviamente, porque eles deveriam começar por:

<?xml version="1.0" encoding="ISO-8859-1" ?>

Você só precisa omitir o "encoding" e esse cabeçalho se usar UTF-8, como você deve ter percebido.

Você pode escolher entre converter os seus arquivos, ou então corrigi-los.

Para converter, é relativamente fácil. Digamos que você tenha um arquivo em ISO-8859-1 e queira convertê-lo para UTF-8.
Você pode ler o arquivo com a codificação ISO-8859-1 e gravá-lo com UTF-8, mais ou menos assim:

import java.io.*;

class Conversor {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader (new InputStreamReader (new FileInputStream 

("entrada.xml"), "ISO-8859-1"));
        BufferedWriter bw = new BufferedWriter (new OutputStreamWriter (new FileOutputStream 

("saida.xml"), "UTF-8"));
        for (String linha = br.readLine(); linha != null; linha = br.readLine())
        {
            bw.write (linha); bw.newLine();
        }
        bw.close();
        br.close();
    }
}

Obviamente você precisa tratar as exceções e encapsular o código acima em um método que receba os nomes dos arquivos de entrada e saída.

Valew thingol … alguns minutos antes de vc responder eu havia feito praticamente do mesmo jeito… porém eu colocava os dois como UTF-8 …

Segue o código:


   String arquivo = request.getParameter("arquivo");

   StringBuffer buffer = new StringBuffer(); 
   BufferedReader in = new BufferedReader (new InputStreamReader(new FileInputStream(arquivo), "ISO-8859-1")); 
   String line; 
  
   while((line = in.readLine()) != null) { 
      buffer.append(line + "\n"); 
   } 

    in.close(); 
    
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(arquivo), "UTF-8")); 
    out.write(buffer.toString()); 
    out.close(); 

Estes xml os quais citei foram alterados a mão em um editor de texto, por isso foram regravados errados…

O código acima agora está funcionando perfeitamente…

O que estava bagunçando os caracteres, era tbm qdo eu forçava para UTF-8 novamente ao editar o xml…

Muito obrigada novamente… :smiley:

A propósito, alguém sabe como eu faço para verificar o encoding do arquivo?

Pq se eu converter uma vez para ler, e depois de editado eu querer ler esse arquivo novamente, os caracteres ficam bagunçados… portanto tenhod e testar antes se o arquivo já está em UTF-8.

Desde já agradeço.

Agora você fez aquela famosa pergunta de US$ 1.000.000,00…

Você pode “chutar” o encoding, mas não é fácil obter uma resposta perfeita. Você deve ter visto que isso dá problemas no Firefox ou no IE quando você põe aquela opção de eles tentarem achar automaticamente o encoding das páginas.

Uma forma boba que nem sempre funciona é:

  • Ler um pedaço do arquivo;
  • Ver se é UTF-8 (se houver algum erro de decodificação, não é UTF-8);
  • Se não for UTF-8, pode ser que seja ISO-8859-1.

Pois é, um problemão ficar fazendo estes testes… :shock:

thingol, vc sabe me dizer se um destes dois encodings tem alguma característica a qual eu possa fazer a validação?

Basicamente, se você codificar um texto ISO-8859-1 em UTF-8, vai ver que as letras acentuadas são convertidas para 2 bytes, sendo que o primeiro é fixo. Como esse teste é meio chato de fazer, é mais fácil tentar converter os bytes para UTF-8, e se der alguma exception, então não é UTF-8.

Ok thingol, obrigada mais uma vez… fiz os devidos testes conforme indicado por vc , só que o problema agora é qdo abre o arquivo pela primeira vez, pois os caracteres vêm bagunçados… pela segunda vez após editado este está funcionando perfeitamente… :lol: