Converter caracteres especiais em arquivos XML

2 respostas
T

Pessoal, bom dia :slight_smile:

A dias tentando entender o que acontece de errado num exemplo que tenho sobre conversão de caracteres especiais(exemplo: ‘ç’ por ‘c’) em arquivos XML, venho postar essa dúvida com vocês.

Tenho uma função que converte caracteres especiais em Java. Realizando alguns testes, percebi que para arquivos XML, a conversão não tem sucesso. Testando em arquivos .txt, a conversão acontece normalmente.

Como converto caracteres especiais em arquivos xml no java?

Vou postar um exemplo que tenho aqui (provavelmente está faltando algo ou está incorreto):

package caractereespecial;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.*;
import java.text.Normalizer.Form;

public class Altera 
{
    public static String lerXML(String fileXML) throws IOException 
    {
        String linha = "";
        StringBuilder xml = new StringBuilder();

        BufferedReader in = new BufferedReader(new InputStreamReader(
                        new FileInputStream(fileXML)));
        while ((linha = in.readLine()) != null) {
                xml.append(linha);
        }
        in.close();

        return xml.toString();
	
    }
    
    public static String normalizar(String stringAcentuada)
    {
        return Normalizer.normalize(stringAcentuada, Form.NFD).replaceAll("[^\\p{ASCII}]", "");  
    }
    
    
    
    //Trata caracteres especiais
    public static String trataCaracteres(String xml)
    {
        /*
        String[] caractereBranco = {
            "\\º", "\\*", "\\'", "\\º", "\\&", "\\°", "\\§", "\\ª", "\\Ø", "\\ø"};
        
        for (int i = 0; i < caractereBranco.length; i++)
        {
            xml = xml.replaceAll(caractereBranco[i], "");
        }
        * 
        */
        
            
            xml = xml.replaceAll("à", "a");
            xml = xml.replaceAll("ã", "a");
            xml = xml.replaceAll("á", "a");
            xml = xml.replaceAll("â", "a");
            xml = xml.replaceAll("è", "e");
            xml = xml.replaceAll("ê", "e");
            xml = xml.replaceAll("é", "e");
            xml = xml.replaceAll("í", "i");
            
            xml = xml.replaceAll("õ", "o");
            xml = xml.replaceAll("ó", "o");
            xml = xml.replaceAll("ô", "o");
            xml = xml.replaceAll("ú", "u");
            xml = xml.replaceAll("ç", "c"); //ç não converte para c   =/
            xml = xml.replaceAll("ñ", "n");
            xml = xml.replaceAll("À", "A");
            xml = xml.replaceAll("Ã", "A");
            xml = xml.replaceAll("Á", "A");
            xml = xml.replaceAll("Â", "A");
            xml = xml.replaceAll("È", "E");
            xml = xml.replaceAll("Ê", "E");
            xml = xml.replaceAll("É", "E");
            
            xml = xml.replaceAll("Í", "I");
            xml = xml.replaceAll("Ô", "O");
            xml = xml.replaceAll("Ó", "O");
            xml = xml.replaceAll("Ú", "U");
            xml = xml.replaceAll("Ç", "c");
            xml = xml.replaceAll("Ñ", "n");
           
        return xml;
    }
}
package caractereespecial;

import java.io.FileWriter;
import java.io.IOException;

public class CaractereEspecial {

    public static void main(String[] args) throws IOException 
    {
        
        String caminhoXML = "D:\\carros.xml";
        //String caminhoXML = args[0];
        
        String xmlEnvio = Altera.lerXML(caminhoXML);
        
        System.out.println(xmlEnvio);
        
        String xmlTratado = Altera.trataCaracteres(xmlEnvio);
        
        System.out.println("\n\n\n\n\n" + xmlTratado);
        
        
        FileWriter fw = new FileWriter("D:\\crt_especial.xml");
        fw.write(xmlTratado);
        fw.close();
        
        /*
        byte[] bytes = xmlTratado.getBytes("UTF-8");
        FileOutputStream out = new FileOutputStream("D:\\crt_especial1.xml"); 
        out.write(bytes);  
        out.close();
        * 
        */
        
       
         
    }
}

Queria a opinião de vocês sobre o problema. Existe alguma API especifica que soluciona o problema? Alguém tem algum exemplo em Java?

Agradeço a ajuda desde já. :smiley:

2 Respostas

G

eu acho bem provável que o problema esteja na codificação dos arquivos… já que o código está certo e a extensão do arquivo não muda a maneira como o programa funciona.

se o file.encoding(codificação padrão para IO) do java estiver ajustado para ISO, só vai funcionar arquivos em codificação ISO… entende?

o que acontece é que se o java está trabalhando com o IO em modo ISO… e você abre um arquivo UTF-8, os caracteres especiais não são reconhecidos corretamente, aí ele não encontra “ç” dentro do texto… apesar de estar lá. Se ele não encontra o caractere, ele não substitui… simples assim.

Esse negócio de codificação é muito chato, então é sempre bom verificar duas vezes isso.

Se depois de tirar a dúvida também pretender tratar arquivos de diferentes codificações… aí o problema é outro.

T

gmcouto:
eu acho bem provável que o problema esteja na codificação dos arquivos… já que o código está certo e a extensão do arquivo não muda a maneira como o programa funciona.

se o file.encoding(codificação padrão para IO) do java estiver ajustado para ISO, só vai funcionar arquivos em codificação ISO… entende?

o que acontece é que se o java está trabalhando com o IO em modo ISO… e você abre um arquivo UTF-8, os caracteres especiais não são reconhecidos corretamente, aí ele não encontra “ç” dentro do texto… apesar de estar lá. Se ele não encontra o caractere, ele não substitui… simples assim.

Esse negócio de codificação é muito chato, então é sempre bom verificar duas vezes isso.

Se depois de tirar a dúvida também pretender tratar arquivos de diferentes codificações… aí o problema é outro.

Obrigado pela dica. :slight_smile:

Criado 19 de outubro de 2012
Ultima resposta 30 de out. de 2012
Respostas 2
Participantes 2