【问题标题】:Qt5 no polish characters after reading from QNetworkReply从 QNetworkReply 读取后,Qt5 没有波兰字符
【发布时间】:2021-01-26 09:34:50
【问题描述】:

我需要从这个 url https://www.nbp.pl/kursy/xml/lasta.xml 获取数据。问题是 response 包含损坏的波兰字符(????? 而不是 śćąęó)。

我的控制台和 GUI 完全能够显示波兰语字符,只有这个 content 字符串坏了。

我不知道该怎么办。我在 Linux 上使用 CLion。

#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 编码的。这解释了这个问题,但我仍然不知道如何处理它。

【问题讨论】:

  • 好像这个 xml 是用 ISO-8859-2 编码的。多么卑鄙……(我到处都是 UTF-8 的粉丝。)你可以考虑一个甚至更通用的解决方案,您以某种方式从响应中提取 XML 编码以将其用作 QTextCodec::codecForName() 中的变量(尽管我一点也不知道如何实现这一点)。 ;-)
  • 如果是带有编码信息的XML,最好根本不转换,而是作为QByteArray传递,让XML解析器处理编码。

标签: c++ qt utf-8 qt5 qnetworkreply


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多