[Resolvido] Caracteres bagunçados (ex.: ç vira ç e á vira á) quando salvo um arquivo do ANTLR

Não consigo salvar um arquivo de texto como UTF-8.

Preciso gerar uma gramática, através de código Java, para um gerador de analisadores léxicos e sintáticos através de código Java. Estou utilizando o ANTLR como analisador e o ANTLRWorks como IDE.

O problema é que quando gero a gramática através de código Java e a abro no ANTLRWorks os caracteres acentuados aparecem bagunçados (ex.: ñ vira ñ, ç vira ç e á vira á).

O que posso fazer para gerar o texto em UTF-8 de modo que ele apareça corretamente no ANTLR, dado que essa é única codificação que ele aceita?

O texto gerado é gravado ou lido de algum arquivo? se for lembre de abrir/gravar o arquivo no formato UTF8, senão dá problema de codificação mesmo.

Eu tentei de duas maneiras. A primeira foi ler o template da gramática de um arquivo e substituir partes dela por partes geradas pelo programa. Na outra maneira eu apenas gerei a uma string via código.

Em ambos os casos tentei gravar a string em um arquivo de saída e obtive esse resultado citado acima.

Coloque o código de como está lendo e gravando as strings. As vezes vc pode gravar tb com ANSI.

Tive um caso do sintegra que estava assim, só colocando ANSI funcionou corretamente.

Um exemplo de código que causa este problema:

private static void save(String outputFilePathname, String text) { private static void save(String outputFilePathname, String text) { FileOutputStream fos = null; try { fos = new FileOutputStream(new File(outputFilePathname)); fos.write("áê".getBytes()); fos.close(); } catch (FileNotFoundException ex) { Logger.getLogger(RulesGenerator.class.getName()).log(Level.SEVERE, null, ex); } catch (IOException ex) { Logger.getLogger(RulesGenerator.class.getName()).log(Level.SEVERE, null, ex); } finally { try { fos.close(); } catch (IOException ex) { Logger.getLogger(RulesGenerator.class.getName()).log(Level.SEVERE, null, ex); } } } }

Acho que pode ter algo a ver com ANSI mesmo. No Notepad++ quando formato como ANSI aparecem os caracteres estranhos. Como mudo o arquivo para codificação ANSI?

Para salvar como UTF8, você tem que criar uma variável de ambiente JAVA_TOOL_OPTIONS, com o valor -Dfile.encoding=UTF8

Na leitura, você pode fazer algo do tipo:

new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF8"));

njava,

    File arq = new File(Diretorio + "DADOS.TXT");
    OutputStream OS = (OutputStream) new FileOutputStream(arq);
    OutputStreamWriter OSW = new OutputStreamWriter(OS, "UTF8");
    PrintWriter Print = new PrintWriter(OSW);
    Print.println(Buffer);
    Print.close();
    OSW.close();
    OS.close();

Esse é o código que uso para gravar setando o charset do arquivo.
Você pode escolher entre UTF8, UTF16, ISO-8859-1 e vários outros, procura sobre o tipo “charset”.
Funciona 100%;

Ignora minha solução. A do Henrique é bem melhor. ;D

Fiz o seguinte mas continua acontecendo o mesmo:

[code] private static void save(String outputFilePathname, String text) {
try {

            File arq = new File(outputFilePathname);
            OutputStream OS = (OutputStream) new FileOutputStream(arq);
            OutputStreamWriter OSW = new OutputStreamWriter(OS, "UTF8");
            PrintWriter Print = new PrintWriter(OSW);
            Print.println(text);
            Print.close();
            OSW.close();
            OS.close();
        } catch (FileNotFoundException ex) {
            Logger.getLogger(RulesGenerator.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(RulesGenerator.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }
}[/code]

Quem sabe se eu formatar como ANSI? Como posso fazer isso?

Vou pesquisar como faz pra ANSI, mas tenta para ISO-8859-1 primeiro.

Parece que está funcionando com " ISO-8859-1". Vou fazer mais uns testes e depois aviso.

Não tinha visto o seu comentário antes de postar o meu anterior, mas parece que está funcionando.

njava,

Você tem que verificar como esta a abertura do arquivo, pois se você gravar em UTF8 e abrir o arquivo em ISO-8859-1 vai dar diferença de charset, ai gera esses caracteres estranhos.

Se você salvar um arquivo em UTF8 e abrir ele no NotePad/WordPad por exemplo ai dar dar diferença pois o padrão do Windows é ISO-8859-1.

Se você pega o arquivo em ISO e abre em UTF8 dá diferença, tem que ser ISO para ISO ou UTF8 para UTF8. Senão você tem que converter.

byte[] bytes = string.getBytes();
String stringCodificada = new String(bytes, "ISO-8859-1");
1 curtida

Muito obrigado! Está funcionando. Acho que cometi um engano. O UTF-8 era necessário para ler arquivos de entrada do depurador do ANTLWorks. De qualquer jeito eu precisava formatar a gramática como ISO-8859-1 mesmo.