Setar o character encoding do cout em C++

Iniciado por Darcamo, 19 de Novembro de 2007, 19:05

tópico anterior - próximo tópico

Darcamo

Sei que para gravar um string em C++ basta criar um objecto da classe ofstream e "jogar" a string nele com o operador << como abaixo
ofstream tempFile("tempFile.txt", ios::out);
tempFile << "Uma string qualquer" << std::endl;


O problema é que o arquivo está sendo salvo com a codificação utf8 que é o padrão do meus sistema. Embora isso normalmente seja o que eu desejo, preciso agora salvar em um arquivo usando a codificação iso8859-1 (a do windows) porque esse arquivo será lido por outro porgrama que espera um arquivo nessa codificação.

Como modifico o ofstream para que ele salve o arquivo com essa codificação de caracteres?

mailson

Eu creio que não seja alguma modificação no fstream e sim na string de texto.
o fstream apenas pega o que foi passado e salva. Como seu sistema trabalha com unicode, todos os acentos que você digitar estarão no formato unicode mas isso não impede que você escreva algo em latin. Você pode por exemplo usar o iconv para converter textos unicodde para latin1 no terminal.
Ex.:

echo "Coração" | iconv -f utf8 -t iso8859-1 > teste.txt

dê um cat no teste.txt

cat teste.txt

e você verá que tem uma interrogação no lugar do acento. Isso porque o texto está armazenado no formato latin1 e o cat não soube fazer a conversão para unicode antes de exibir na tela.

Obs.: Se você abrir o arquivo usando o gedit, verás que está tudo ok com os acentos. Isso porque o gedit verificou que o charset do arquivo era latin1 e por isso foi exibido corretamente.

A solução que eu tenho em mente é você percorrer caractere por caractere no texto que vai ser armazenado no arquivo e fazer a conversão
Tente ver o código fonte do iconv que lá deve ter como ele faz essa conversão
Acredito que existam bibliotecas para c que façam esse tipo de conversão

Outra coisa que você poderia fazer (no caso de estar gravando arquivos de texto) é após usar o programa, converter o charset usando o iconv.
Ex.: iconv -f utf8 -t iso8859-1 arquivo.txt --output arquivo.txt.aux && rm arquivo.txt && mv arquivo.txt.aux arquivo.txt

Pode ser que exista uma solução mais simples mas eu desconheço. Pode ser até que a própria biblioteca padrão do C tenha algo para converter e eu não saiba. Mas as dicas estão dadas

Darcamo

Muito obrigado pela resposta mailson.

O ideal seria então poder especificar o formato em que uma variável string está como iso8859-1 antes de enviar para o arquivo. Sabendo disso talvez eu tenha mais sorte em minhas buscas no "oráculo". Mas por enquanto sua solução de converter o arquivo salvo com o iconv deve atender bem minhas necessidades.

O que estou fazendo é uma interface para o gnuplot, de forma que quando eu queira plotar um gráfico em programas feitos em C++ eu possa usar essa interface que gerará um arquivo de configuração com os comandos para o gnuplot.

Como os "labels" dos gráficos podem ter caracteres acentuados e o gnuplot não trabalha bem com utf8 (alguns terminais de saída do gráfico apresentam problemas e outros não) então queria salvar tudo nesse arquivo de configuração em iso8859-1.