Qt5 не полирует символы после чтения из QNetworkReply

Мне нужно получить данные с этого URL-адреса https://www.nbp.pl/kursy/xml/lasta.xml. Проблема в том, что response содержит неверные польские символы (??????? вместо śćąęó).

Моя консоль и графический интерфейс полностью способны отображать полированные символы, и только эта строка content не работает.

Я понятия не имею, что с этим делать. Я использую CLion в Linux.

#include "DataDownloader.h"
#include <QtWidgets/QMessageBox>

std::string DataDownloader::downloadData() const
{
    QNetworkAccessManager manager;
    QNetworkReply *response = manager.get(QNetworkRequest(QUrl(this->url)));
    QEventLoop event;
    connect(response, SIGNAL(finished()), &event, SLOT(quit()));
    event.exec();

    std::string content = QString(response->readAll()).toStdString();

    return content;
}

Редактировать: на самом деле другие сайты, содержащие польские знаки, работают нормально. Но все же, я должен заставить его работать с тем, что я предоставил выше

Редактировать 2: похоже, что этот xml закодирован в ISO-8859-2. Это объясняет проблему, но я до сих пор не знаю, как с ней справиться.


person vixu    schedule 12.10.2020    source источник
comment
Похоже, что этот xml закодирован в ISO-8859-2. Как это закулисно... (Я поклонник UTF-8 во всем мире.) Вы могли бы рассмотреть еще более общее решение, когда вы извлекаете XML-кодирование как-то из ответа, чтобы использовать его как переменную в QTextCodec::codecForName() (хотя я не имею ни малейшего представления, как этого добиться). ;-)   -  person Scheff's Cat    schedule 12.10.2020
comment
Если это XML с информацией о кодировке, лучше вообще не преобразовывать, а передать как QByteArray и позволить синтаксическому анализатору XML обрабатывать кодировку.   -  person Frank Osterfeld    schedule 12.10.2020


Ответы (1)


Это работает.

std::string DataDownloader::downloadData() const
{
    QNetworkAccessManager manager;
    QNetworkReply *response = manager.get(QNetworkRequest(QUrl(this->url)));
    QEventLoop event;
    connect(response, SIGNAL(finished()), &event, SLOT(quit()));
    event.exec();

    QTextCodec* codec = QTextCodec::codecForName("ISO-8859-2");
    QTextDecoder decoder{codec};

    return decoder.toUnicode(response->readAll()).toStdString();
}
person vixu    schedule 12.10.2020