Unicode 字符、C++ 和 libcurl

问题描述 投票:0回答:1

我使用 stringstream 和 libcurl 来下载数据。我也有一个解析函数。

bool parse()
{
    istringstream temp(buff.str());
    buff.str("");
    string line;
    QString line_QStr, lyrics_QStr;
    while (temp.good())
    {
        getline(temp, line);
        if (QString::fromStdString(line).contains(startMarker)) break;
    }
    if (!temp.good()) return false; // something went wrong

    while (temp.good())
    {
        getline(temp, line);
        if ((line_QStr = QString::fromStdString(line)).contains(endMarker))
        {
            lyrics_QStr += line_QStr.remove(endMarker); // remove the </div>
            break;
        }
        else
        {
            lyrics_QStr += line_QStr;
        }
    }

    if (!temp.good()) return false;

    QTextDocument lyricsHtml;
    lyricsHtml.setHtml(lyrics_QStr);
    lyrics_qstr = lyricsHtml.toPlainText();
    return true;
}

当文本仅是 ascii 时就可以了。但如果它是 unicode,那么我会在这个函数中的某个地方丢失 unicode 字符。结果是这样的:

Unicode chars are messed up

我使用 string 和 getline 而不是 QTextStream 和 QString,因为我找不到 good() 函数的任何对应项,所以我无法进行任何像样的错误处理。

我在这个函数中做错了什么,unicode 字符丢失并显示为另外 2 个字符?我该如何修复它? 预先感谢!

编辑:我将解析函数更改为:

bool LyricsManiaDownloader::parse()
{
    wistringstream temp(string2wstring(buff.str()));
    buff.str("");
    wstring line;
    QString line_QStr, lyrics_QStr;
    while (temp.good())
    {
        getline(temp, line);
        if (QString::fromStdWString(line).contains(startMarker)) break;
    }
    if (!temp.good()) return false; // something went wrong

    while (temp.good())
    {
        getline(temp, line);
        if ((line_QStr = QString::fromStdWString(line)).contains(endMarker))
        {
            lyrics_QStr += line_QStr.remove(endMarker); // remove the </div>
            break;
        }
        else
        {
            lyrics_QStr += line_QStr;
        }
    }

    if (!temp.good()) return false;

    QTextDocument lyricsHtml;
    lyricsHtml.setHtml(lyrics_QStr);
    lyrics_qstr = lyricsHtml.toPlainText();
    return true;
}

而 string2wstring 函数是

wstring string2wstring(const string &str)
{
    wstring wstr(str.length(), L' ');
    copy(str.begin(), str.end(), wstr.begin());
    return wstr;
}

编码方面还存在一些问题。

EDIT2:我使用此函数将数据保存到字符串流中

size_t write_data_to_var(char *ptr, size_t size, size_t nmemb, void *userdata)
{
    ostringstream * stream = (ostringstream*) userdata;
    size_t count = size * nmemb;
    stream->write(ptr, count);
    return count;
}

我将std::ostringstream buff传递给curl,网页数据就保存在这里。 然后我使用 wistringstream,将 buff.str() 转换为 wstring 并将其用作 wistringstream 的源。 从 std::string 到 std::wstring 的转换就是解码,不是吗?

string unicode encoding stringstream stdstring
1个回答
1
投票

Web 服务器返回一个字节流以及一个标头,该标头指示这些字节应被理解为什么编码。

© www.soinside.com 2019 - 2024. All rights reserved.