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のみの場合は問題ありません。しかし、それがユニコードの場合、私はこの関数のどこかでユニコード文字を失っています。そしてそれはこのようなものになります:
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への変換はデコードですよね?