There are 2 reasons why this occurs:
it is because QString
internally works with latin1
, the other reason is that
All files generated by Qtcreator are encoded in UTF-8, or even the .cpp
and .h
So while trying to merge the data from .cpp
which in this case are:
stream << "<p align=center><font size=4><font face=times><b>PROCURAÇÃO...
And when you set the value of ui->lineNome->text()
for a QString
you will be working with different encodings, if your "html" was set in a QString
before passing the QTextStream
.
Then the .cpp
where you wrote your "HTML" inside the stream is in UTF-8 and ui->lineNome->text()
should be with latin1. When you try to decode with:
stream.setCodec("ISO-8859-1");
Or something like it will affect the whole stream
, and as it has Unicode mixed with latin1 it will attempt to decode something that is already decoded, generating the interrogation signals as OT?IO JEFERS?
I ran a test, opened mine .cpp
, created by Qtcreator itself a 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 the widget.cpp
by sublimetext and it showed utf8, as in the image:
I compiled and ran the program, then in the field nomeDoCliente
typed Á É Í Ó Ú
and clicked the save button that ran Widget::save
, the content generated was this:
Titulo:Olá mundo!
Nome:Á É Í Ó Ú
And in sublimetext it shows it as windows-1252, ie the Olá
are characters of utf-8 mixed with latin1
Then I saved the widget.cpp
like iso-8859-1 (compatible with latin1) by sublimetext, it looked like this:
So I recompiled the entire project, ran the program and click save, the data.txt
now has this content:
Titulo:Olá mundo!
Nome:Á É Í Ó Ú
Look, it wasn’t necessary setCodec
or anything, the file data.txt
got the perfect accents and by sublimetext he accuses as windows-1252 (compatible with latin1).
How to solve
Yet keep opening one by one of your own .cpp
and saving as windows-1252 or iso-8859-1 is no easy task, even more if you are using Qtcreator, to simplify just leave all values in QString
always so it will use the default encoding always, see an example that worked:
void Widget::save()
{
QString textopadrao = "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 so much value from nomeDoCliente
as to what was in the textopadrao
used the same encoding.
So 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 performed the test and worked perfectly, note that for tests I set all variables with the value of the field "Name" which in the case was this "isso é um teste blá á ã ô"
, and worked perfectly generating this result in the data.txt
:
<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>
Man, I haven’t tested it yet, but it makes a lot of sense what you said! I can’t believe I didn’t think about it, it shows that I have a long way to go anyway! I found it an honor to be answered by you, I saw your profile yesterday! You have done a lot for the community! If you can show me some material to start, I appreciate it! Maximum respect...
– creepohard
@creepohard thanks! So some things from Qt I learned in Stackoverflow, others I learned by reading the examples http://doc.qt.qt.io/qt-5/qtexamplesandtutorials.html#examples, which although in English helped me a lot, I personally like to learn by testing, then I go to the documentation read the details: http://doc.qt.io/qt-5/reference-overview.html, I hope it helps, and if you have any doubts just ask, besides me have 4 more users on the site that have good control of Qt.
– Guilherme Nascimento