There are 2 reasons why this occurs:
is because QString
internally works with latin1
, the other reason is that
All files generated by QtCreator are encoded in UTF-8, ie even .cpp
and .h
Then when trying to merge the data of .cpp
which in the case are these:
stream << "<p align=center><font size=4><font face=times><b>PROCURAÇÃO...
And when you set the value from ui->lineNome->text()
to QString
you will be working with different encodings if your html was set to QString
before passing QTextStream
.
So the% w / w where you wrote your "HTML" inside the stream is in UTF-8 and .cpp
must be latin1. When you try to decode with:
stream.setCodec("ISO-8859-1");
Or something similar it will affect all ui->lineNome->text()
, and as it has unicode mixed with latin1 it will try to decode something that is already decoded, generating the question marks as stream
I ran a test, opened my OT?IO JEFERS?
, created by QtCreator the same project, with the following content:
#include "widget.h"
#include "ui_widget.h"
#include <QFile>
#include <QTextStream>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
QObject::connect(ui->btnSave, SIGNAL(pressed()), this, SLOT(save()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::save()
{
QString filename = "data.txt";
QFile file(filename);
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << "Titulo:" << "Olá mundo!" << endl;
stream << "Nome:" << ui->nomeDoCliente->text() << endl;
file.close();
}
}
I opened .cpp
by sublimetext and it showed utf8, as in the image:
Icompiledandexecutedtheprogram,theninthewidget.cpp
fieldItypednomeDoCliente
andclickedthesavebuttonthatexecutedÁÉÍÓÚ
,thegeneratedcontentwasthis:
Titulo:Olámundo!Nome:ÁÉÍÓÚ
Andinsublimetextshowsitbeinglikewindows-1252,ieWidget::save
areutf-8charactersmixedwithlatin1
ThenIsavedOlá
asiso-8859-1(latin1compatible)tosublimetext,itlookedlikethis:
Thenrecompiletheentireproject,runtheprogramandclicksave,widget.cpp
nowhasthiscontent:
Titulo:Olámundo!Nome:ÁÉÍÓÚ
See,youdidnotneeddata.txt
oranything,thefilesetCodec
gotperfectaccentsandbysublimetextitaccuseslikewindows-1252(compatiblewithlatin1).
Howtosolve
However,openingonebyoneofyourdata.txt
andsavingaswindows-1252oriso-8859-1isnotaneasytask,especiallyifyouareusingQtCreator,forsimplicityjustleaveallvaluesin.cpp
alwayssinceitwillalwaysusethedefaultencoding,seeanexamplethatworked:
voidWidget::save(){QStringtextopadrao="Olá mundo!";
QString nome = ui->nomeDoCliente->text();
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << "Titulo:" << textopadrao << endl;
stream << "Nome:" << nome << endl;
file.close();
}
}
After saving both the value from QString
and that from nomeDoCliente
they used the same encoding.
Then do this in your code (add line breaks because it gets easier):
QString conteudoHtml = ""
"<p align=center><font size=4><font face=times><b>"
"PROCURAÇÃO AD JUDICIA E ET EXTRA</b></font></font></center>"
"" + ent + ent + ent + "<font size=3,25><font face=times>"
"<p align=justify> Por este instrumento particular, " + "<b>"
"" + noM + "</b>" + " brasileiro(a), " + ciV + ", " + emP + ""
", portador(a) da Cédula de Identidade número RG n. rG "
"nascido em: " + ", inscrito(a) no CPF sob n. " + cpF + ", PIS "
"" + piS + ", CTPS / N. / Série " + ctpS + ", e-mail: <u>" + emA + ""
"</u>, residente e domiciliado(a) na " + enD + ", " + ceP + " - "
"" + ciD + "/" + esT + ", nomeia e constitui como seus procuradores e advogados,"
" <b>Antônio Sérgio Meorin - OAB/SP n. 328.518 e Júlio César Lopes de Araújo -"
" OAB/SP n. 379.678</b>, ambos, com escritório profissional situado na Rua"
" Paraíba, 583, Centro, São Joaquim da Barra/SP, aos quais confere os poderes"
" da presente procuração para o foro em geral, inclusive o <i>et extra</i>,"
" para, independente da ordem de nomeação, agir em nome do(a) outorgante, em"
" quaisquer Juízos, instâncias, Tribunais, Repartições Públicas, com amplos e"
" ilimitados poderes, podendo propor as ações competentes e defendê-o(a) nas"
" contrárias, seguinda umas e outras até final decisão, usando os recursos,"
" desistindo ou dispensando-os, podendo praticar todos os atos que se tornarem"
" necessários, ao útil, bom e fiel desempenho deste mandato, inclusive"
" substavelecer, com ou sem reservas de poderes, receber intimação, confessar,"
" reconhecer a procedência do pedido, transigir, desistir, renunciar, receber e"
" dar recibo, dar quitação, acordar e firmar compromisso." + ent + ent + ""
" Declaro, para os fins de concessão dos benefícios da Justiça Gratuita que, em"
" conformidade com o disposto na CF de 88, artigo 5º, LXXIV e Leis n.º1060/50 e"
" 7.115/83, <u>sob as penas da lei</u>, art. 299 do CP, que sou pessoa <b>pobre</b>,"
" na <u>acepção legal exata do termo</u>, cuja situação financeira não permite"
" pagar as custas do processo, sem prejuízo do sustento próprio ou da família."
"" + ent + ent + "Por ser verdade, e para que surta seus legais e jurídicos efeitos,"
" assina a presente, nesta data, sob as penas da lei." + ent + ent + ""
"<p align=left>São Joaquim da Barra/SP, " + proC + "." + ent + ent + ent + ""
"" + ent + "<center><b>______________________________________</b></center>" + ent + ""
"<center>OUTORGANTE</center></b></font></font>";
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream << conteudoHtml << endl;
file.close();
}
If you want to save as UTF-8 just do this:
if (file.open(QIODevice::WriteOnly)) {
QTextStream stream(&file);
stream.setCodec("UTF-8");
stream << conteudoHtml << endl;
file.close();
}
I ran the test and it worked perfectly, note that for tests I have set all variables with the value of the field "Name" which in this case was textopadrao
, and worked perfectly generating this result in "isso é um teste blá á ã ô"
:
<p align=center><font size=4><font face=times><b>PROCURAÇÃO AD JUDICIA E ET EXTRA</b></font></font></center>
<font size=3,25><font face=times><p align=justify> Por este instrumento particular, <b>"isso é um teste blá á ã ô"</b> brasileiro(a), "isso é um teste blá á ã ô", "isso é um teste blá á ã ô", portador(a) da Cédula de Identidade número RG n. rG nascido em: , inscrito(a) no CPF sob n. "isso é um teste blá á ã ô", PIS "isso é um teste blá á ã ô", CTPS / N. / Série "isso é um teste blá á ã ô", e-mail: <u>"isso é um teste blá á ã ô"</u>, residente e domiciliado(a) na "isso é um teste blá á ã ô", "isso é um teste blá á ã ô" - "isso é um teste blá á ã ô"/"isso é um teste blá á ã ô", nomeia e constitui como seus procuradores e advogados, <b>Antônio Sérgio Meorin - OAB/SP n. 328.518 e Júlio César Lopes de Araújo - OAB/SP n. 379.678</b>, ambos, com escritório profissional situado na Rua Paraíba, 583, Centro, São Joaquim da Barra/SP, aos quais confere os poderes da presente procuração para o foro em geral, inclusive o <i>et extra</i>, para, independente da ordem de nomeação, agir em nome do(a) outorgante, em quaisquer Juízos, instâncias, Tribunais, Repartições Públicas, com amplos e ilimitados poderes, podendo propor as ações competentes e defendê-o(a) nas contrárias, seguinda umas e outras até final decisão, usando os recursos, desistindo ou dispensando-os, podendo praticar todos os atos que se tornarem necessários, ao útil, bom e fiel desempenho deste mandato, inclusive substavelecer, com ou sem reservas de poderes, receber intimação, confessar, reconhecer a procedência do pedido, transigir, desistir, renunciar, receber e dar recibo, dar quitação, acordar e firmar compromisso.
Declaro, para os fins de concessão dos benefícios da Justiça Gratuita que, em conformidade com o disposto na CF de 88, artigo 5º, LXXIV e Leis n.º1060/50 e 7.115/83, <u>sob as penas da lei</u>, art. 299 do CP, que sou pessoa <b>pobre</b>, na <u>acepção legal exata do termo</u>, cuja situação financeira não permite pagar as custas do processo, sem prejuízo do sustento próprio ou da família.
Por ser verdade, e para que surta seus legais e jurídicos efeitos, assina a presente, nesta data, sob as penas da lei.
<p align=left>São Joaquim da Barra/SP, "isso é um teste blá á ã ô".
<center><b>______________________________________</b></center>
<center>OUTORGANTE</center></b></font></font>