2

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文字がめちゃくちゃです

QTextStreamとQStringの代わりにstringとgetlineを使用します。これは、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に渡すと、Webページのデータがここに保存されます。次に、wistringstreamを使用し、buff.str()をwstringに変換して、wistringstreamのソースとして使用します。std::stringからstd::wstringへの変換はデコードですよね?

4

1 に答える 1