[問題][QT] readline空格後面被丟棄

看板C_and_CPP (C/C++)作者 (薯)時間2年前 (2021/12/11 12:12), 2年前編輯推噓0(007)
留言7則, 1人參與, 2年前最新討論串1/1
我的開發平台是 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

12/11 12:27, 2年前 , 1F
%00 是 null terminator ㄅ,我猜你說的空格其實就是
12/11 12:27, 1F

12/11 12:27, 2年前 , 2F
'\0',所以readline()讀到這就覺得讀完了
12/11 12:27, 2F
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

12/11 13:15, 2年前 , 3F
我講錯了,是QString(QByteArray)建構的時候讀到'\0'
12/11 13:15, 3F

12/11 13:15, 2年前 , 4F
覺得讀完了
12/11 13:15, 4F
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

12/11 13:56, 2年前 , 5F
我猜用 QByteArray::replace() 就好,如果你不打算
12/11 13:56, 5F

12/11 13:57, 2年前 , 6F
把'\0' 當作他名字的一部分也可以先把整個文件讀起來
12/11 13:57, 6F

12/11 13:58, 2年前 , 7F
先把'\0'通通清掉,再用你一開始一行一行讀的方法
12/11 13:58, 7F
文章代碼(AID): #1Xj2L8V_ (C_and_CPP)
文章代碼(AID): #1Xj2L8V_ (C_and_CPP)