Problema para escrever um arquivo com UTF-8 em Groovy
No meu trabalho precisei realizar uma tarefa que consistia em pegar um arquivo xml e gerar um outro arquivo, também em xml, a partir dos dados do primeiro. A princípio pediram que fizesse “na mão” mas como sou pago para pensar e não para executar as coisas feito uma máquina, parti para criar algo que fizesse isso de forma automática.
Para fazer o trabalho criei um script em Groovy por ter uma certa intimidade com a linguagem e pela facilidade que ela oferece para manipular dados em formato xml (veja o trecho abaixo).
{
def select = new XmlParser().parse("${folderLeitura}\\${arquivo}");
File file_xml_out = new File ("${folderCidadesDestino}\\${arquivo}");
file_xml_out .append('<?xml version="1.0" encoding="UTF-8"?>');
file_xml_out .append("\n");
file_xml_out .append(''' <select id="cidade" name="cidade" onblur="campoObrig(this)">''');
file_xml_out .append("\n");
select.option.each(){
valor = it.text();
texto = valor;
id = it.@value;
if(valor == "Selecione a Cidade")
{
valor = "";
}
else
{
geraArquivoUpdateParaCidade(file_sql_out,valor,id)
}
file_xml_out .append("""<option value="${valor}">${texto}</option> """);
file_xml_out .append("\n");
...
O script após pronto funcionou perfeitamente, porém com um problema residente no fato do arquivo de saída ter sido salvo com codificação padrão do sistema operacional (o lixo do Microsoft grava tudo em ANSI ). No primeiro teste que fiz com os dados acusou o erro com caracteres acentuados.
O desafio foi achar uma forma, simples, de alterar o encoding do arquivo de saída para o valor que eu quero. Após muitas pesquisas no google, leituras de doc, etc… A solução extremamente elegante que achei foi (veja trecho abaixo).
{
def select = new XmlParser().parse("${folderLeitura}\\${arquivo}");
File file_xml_out = new File ("${folderCidadesDestino}\\${arquivo}");
file_xml_out.<strong>withWriter('UTF-8')</strong> { saida ->
saida.append('<?xml version="1.0" encoding="UTF-8"?>');
saida.append("\n");
saida.append(''' <select id="cidade" name="cidade" onblur="campoObrig(this)">''');
saida.append("\n");
select.option.each(){
valor = it.text();
texto = valor;
id = it.@value;
if(valor == "Selecione a Cidade")
{
valor = "";
}
else
{
geraArquivoUpdateParaCidade(file_sql_out,valor,id)
}
saida.append("""<option value="${valor}">${texto}</option> """);
saida.append("\n");
}
...
Aqui você informe que ao invés do objeto file usar um writer com valor de caracter padrão, ele deve usar um que use o UTF-8. Para quem está familiarizado com padrões de projeto é um Decorator.
O ser humano por mais desbravador e aventureiro que seja seu espírito ( estamos tentando ir para todo lado, entender tudo, etc) sempre vive um desconforto frente a possibilidade de experimentar o novo. Que criança nunca “torceu o nariz” quando a mãe mandava provar uma comida que não tinha visto antes; que pessoa num recuou frente a um possibilidade de ir em direção a uma oportunidade nova; quem nunca sentiu insegurança quando se formou e agora terá de enfrentar um mundo novo… O problema é quando esse desconforto virá medo paralisante e inconscientemente nos tornamos agressivos com relação aos agentes da mudança.
Quando o medo (receio) frente a mudança se torna agressividade – agressividade aqui diz respeito ao bloqueio e criticas mordazes - isso acaba virando um jogo perigoso e, em minha opinião, NUNCA é (ou será) bom para nenhuma empresa. Em muitos casos, as coisa ficam num clima de guerra onde existe o pessoal que defende a mudança “com unhas e dentes” e outros que contrariam as mudanças “com unhas e dentes” . Sei que existem milhares de técnicas, dinâmicas, e outras coisas, que podem miticar esse clima, mas um vez esse ambiente criado sempre existirá um desgaste que poderia ser evitado se as pessoas agissem como humanos e fossem mais desbravadoras.