Accents with QString in Qt 5.9 results in bizarre characters

1

Hi, good afternoon, I'm with a doubt that I can not 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 do not know how to skip lines without breaking the code) the code works, the one typed in the stream, after setCodec is normal, however, set codec does not transform the variables that I created in QString, bug in the accents, for example, the name:

  

By this particular instrument, OT? IO JEFERS? Brazilian, single, 561, bearer of Cédula

The name should come out "OTÁVIO JEFERSÃO", however, is replaced by?, while the rest comes out normally, like the "Certificate" that has been spelled .... what is happening, and how can I fix it? If I wrap the codec for UTF-8, the variables are normal and the rest of the text is all zuado .... what is the solution? This has been 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();

Thank you in advance for suggestions on learning materials!

    
asked by anonymous 09.12.2017 / 18:15

1 answer

0

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.cppfieldItypednomeDoClienteandclickedthesavebuttonthatexecutedÁÉÍÓÚ,thegeneratedcontentwasthis:

    Titulo:Olámundo!Nome:ÁÉÍÓÚ

    Andinsublimetextshowsitbeinglikewindows-1252,ieWidget::saveareutf-8charactersmixedwithlatin1

    ThenIsavedOláasiso-8859-1(latin1compatible)tosublimetext,itlookedlikethis:

    Thenrecompiletheentireproject,runtheprogramandclicksave,widget.cppnowhasthiscontent:

    Titulo:Olámundo!Nome:ÁÉÍÓÚ

    See,youdidnotneeddata.txtoranything,thefilesetCodecgotperfectaccentsandbysublimetextitaccuseslikewindows-1252(compatiblewithlatin1).

    Howtosolve

    However,openingonebyoneofyourdata.txtandsavingaswindows-1252oriso-8859-1isnotaneasytask,especiallyifyouareusingQtCreator,forsimplicityjustleaveallvaluesin.cppalwayssinceitwillalwaysusethedefaultencoding,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>
    
        
    10.12.2017 / 02:33