Qstring accents in Qt 5.9 results in bizarre characters

Asked

Viewed 559 times

1

Hi, good afternoon, I have a question I can’t fix at all the code is as follows:....

       QTextStream stream( &file );
             stream.setCodec("ISO 8859-1");
             stream << "<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>" ;

so far so good, despite the mess (I’m starting and I don’t even know how to skip lines without breaking the code) the code works, the one typed in the stream, after setCodec is normal, however, the set codec does not transform the variables that I created in Qstring, Ugam in the accents, for example, the name:

For this particular instrument, OT? IO JEFERS? Brazilian(a), single(a), 561, bearer(a) Ballot

The name should come out "OTÁVIO JEFERSÃO", however, is replaced by ? , while the rest comes out normally, as the "Ballot" that was highlighted.... what’s going on, and how can I fix it? If I select the codec for UTF-8, the variables are normal and the rest of the text is all messed up.... what is the solution? There are days...

follows the list of created variables:

QString noM = ui->lineNome->text().toUpper();
QString ceP = ui->lineCep->text();
QString ciD = ui->lineCid->text();
QString cpF = ui->lineCpf->text();
QString ctpS = ui->lineCtps->text();
QString rG = ui->lineRg->text();
QString enD = ui->lineEnd->text();
QString esT = ui->boxEst->currentText();
QDate daT = ui->dateDat->date();
QString nuM = ui->lineNum->text();
QString ciV = ui->boxCiv->currentText();
QString emP = ui->lineEmp->text().toLower();
QString comP = (nuM) + (" - ") + (noM);
QString piS = ui->linePis->text();
QString emA = ui->lineEma->text();
QString proC = ui->lineProc->text();

Thanks, from now on, I accept suggestions of learning materials!

1 answer

0


There are 2 reasons why this occurs:

  1. it is because QString internally works with latin1, the other reason is that

  2. 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:

cpp utf8

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:

cpp iso-8850-1

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>
  • 1

    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 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.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.