作者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://www.ptt.cc/bbs/C_and_CPP/M.1639195976.A.7FF.html
※ 編輯: liu2007 (123.192.225.144 臺灣), 12/11/2021 12:14:44
→ nh60211as: %00 是 null terminator ㄅ,我猜你說的空格其實就是 12/11 12:27
→ 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
→ nh60211as: 我講錯了,是QString(QByteArray)建構的時候讀到'\0' 12/11 13:15
→ 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
→ nh60211as: 我猜用 QByteArray::replace() 就好,如果你不打算 12/11 13:56
→ nh60211as: 把'\0' 當作他名字的一部分也可以先把整個文件讀起來 12/11 13:57
→ nh60211as: 先把'\0'通通清掉,再用你一開始一行一行讀的方法 12/11 13:58