作者liu2007 (薯)
看板C_and_CPP
标题[问题][QT] readline空格後面被丢弃
时间Sat Dec 11 12:12:54 2021
我的开发平台是 win7
工具是QT Creator
版本是Qt Core 5.15.2
我用QNetworkReply 去收网页内容并且分析
网页是很固定的纯文字内容
本来爬得很顺利的
以下是程式码
m_PageRequest.setUrl(QUrl{urlString});
QNetworkReply *reply = m_Manager.get(m_PageRequest);
QEventLoop event_loop;
QObject::connect(reply, SIGNAL(finished()), &event_loop, SLOT(quit()));
event_loop.exec();
QString headLine{reply->readLine()};
if(headLine.contains(SUCCESSED_HEADLINE)){
for(int i{0};i<23;i++) //我要的资料在剩下的第24行
reply->readLine();
QString raw{reply->readLine()};
parse(raw);
}
但是网页的文字里面包含某一个特定的名字的时候
程式就会出错。
这个名字从网页看起来只有三个字 XXX
把它复制上PTT来看也的只有三个字 XXX
但是在chorme的检视网页原始码里面就变成 XX X
中间空了一个空白
https://imgur.com/rH0j2nP
左边/uploader/後面那一串就是他的名字网页编码
本来正常情况下uploader後面还有资料是我需要的
但是只要遇到这个名字,字串却只有到名字中间的空白,空白後面的资料都没了
本来以为是跑到下一行,但并没有。
现在文章打到一半我在想是不是
QString raw{reply->readLine()};
在readLine() 的资料转换成 QString的时候,把那个空白当作结束符号
後面的就没有copy到raw 这个QString里面了
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.192.225.144 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1639195976.A.7FF.html
※ 编辑: liu2007 (123.192.225.144 台湾), 12/11/2021 12:14:44
1F:→ nh60211as: %00 是 null terminator ㄅ,我猜你说的空格其实就是 12/11 12:27
2F:→ nh60211as: '\0',所以readline()读到这就觉得读完了 12/11 12:27
ba: 50524
rba: 14367
reply->readLine()的ByteArray size = 50524
QString raw{reply->readLine()}; raw.toUtf8().size = 14367
看来要找怎麽拔ByteArray里的结束字元的方法了.....
※ 编辑: liu2007 (123.192.225.144 台湾), 12/11/2021 12:46:39
3F:→ nh60211as: 我讲错了,是QString(QByteArray)建构的时候读到'\0' 12/11 13:15
4F:→ nh60211as: 觉得读完了 12/11 13:15
QByteArray ba{reply->readLine()};
QByteArray nba;
foreach(char c, ba){
if (c != '\0')
nba.push_back(c);
}
QString raw{nba};
※ 编辑: liu2007 (123.192.225.144 台湾), 12/11/2021 13:34:12
5F:→ nh60211as: 我猜用 QByteArray::replace() 就好,如果你不打算 12/11 13:56
6F:→ nh60211as: 把'\0' 当作他名字的一部分也可以先把整个文件读起来 12/11 13:57
7F:→ nh60211as: 先把'\0'通通清掉,再用你一开始一行一行读的方法 12/11 13:58