我使用 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 字符。结果是这样的:
我使用 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 的转换就是解码,不是吗?
Web 服务器返回一个字节流以及一个标头,该标头指示这些字节应被理解为什么编码。