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

13 respostas
N

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?

13 Respostas

H

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.

N

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.

H

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.

N

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?

D

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

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%;

D

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

N
Fiz o seguinte mas continua acontecendo o mesmo:
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);
            } 
        }
    }

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

D

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

N

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

N

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

H

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

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.

Criado 27 de dezembro de 2011
Ultima resposta 28 de dez. de 2011
Respostas 13
Participantes 3