Ik probeer in Qt een webcrawler te maken. Ik gebruik nu voor dat doel een antiek powershell script, waar ik eigenlijk tegen dezelfde problemen aan liep: character sets. Dat heb ik destijds opgelost door een boel replace commands, maar dat is natuurlijk niet zo elegant.
Neem bijvoorbeeld de pagina http://configure.euro.del...dhs1&vw=classic&~lt=print. In mijn browser wordt hij correct gerenderd:

Download ik de pagina via mijn programmatje en output ik deze naar een file, dan zijn de resultaten niet zo mooi:

datzelfde, in een hex editor:
� 778,00 in latin-1 komt er dan uitrollen volgens die uitstekende converter van .oisyn. Maar ik krijg het niet voor elkaar een fatsoenlijke output te krijgen. Zelfs als ik meerdere stappen probeer (latin1 -> UTF-8 -> ...)
relevant code snippet:
Dat uitgecommente stuk code is natuurlijk waar de conversie van het juist characterset moet gebeuren. Maar ik ben al het hele weekend bezig om uit te zoeken wélk obscuur character set er wordt gebruikt. Daar moet toch een truukje voor zijn?
Neem bijvoorbeeld de pagina http://configure.euro.del...dhs1&vw=classic&~lt=print. In mijn browser wordt hij correct gerenderd:

Download ik de pagina via mijn programmatje en output ik deze naar een file, dan zijn de resultaten niet zo mooi:

datzelfde, in een hex editor:
code:
1
| E2 3F AC C2 A0 37 37 38 2C 30 30 |
� 778,00 in latin-1 komt er dan uitrollen volgens die uitstekende converter van .oisyn. Maar ik krijg het niet voor elkaar een fatsoenlijke output te krijgen. Zelfs als ik meerdere stappen probeer (latin1 -> UTF-8 -> ...)
relevant code snippet:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| void Networker::download(const char* url) { QNetworkAccessManager *manager = new QNetworkAccessManager(); connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*))); manager->get(QNetworkRequest(QUrl(url))); } void Networker::replyFinished(QNetworkReply* reply) { QString data(reply->readAll()); // readAll geeft een QByteArray terug // QTextCodec *codec = QTextCodec::codecForName("UTF-8"); // data = codec->toUnicode(data.toStdString().c_str()); // sla data naar file.. } |
Dat uitgecommente stuk code is natuurlijk waar de conversie van het juist characterset moet gebeuren. Maar ik ben al het hele weekend bezig om uit te zoeken wélk obscuur character set er wordt gebruikt. Daar moet toch een truukje voor zijn?