我使用 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-only 时是可以的。但如果它是 unicode,那么我会在这个函数的某个地方丢失 unicode 字符。结果是这样的:
我使用 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 的转换是解码,不是吗?