Konvertieren QUrl mit percent-encoding in string
Ich eine URL verwenden, die durch den Benutzer eingegeben werden, als text zum initialisieren einer QUrl Objekt. Später will ich wandeln die QUrl zurück in einen string für die Ausgabe zu prüfen und es mit regular expression. Dies funktioniert gut, solange der Benutzer nicht geben Sie einen beliebigen Prozent-codierte URLs.
Nicht warum der folgende Beispiel-code funktioniert?
qDebug() << QUrl("http://test.com/query?q=%2B%2Be%3Axyz%2Fen").toDisplayString(QUrl::FullyDecoded);
Es einfach nicht decodieren jeder der Prozent-codierten Zeichen. Es sollte drucken "http://test.com/query?q=++e:xyz/en"
aber es tatsächlich druckt "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
.
Ich habe auch versucht, eine Menge von anderen Methoden wie fromUserInput (), aber ich konnte nicht machen den code korrekt in Qt5.3.
Kann jemand mir erklären, wie Sie dies tun und warum der obige code funktioniert nicht (d.h. zeigt die dekodierten URL), auch wenn mit QUrl::FullyDecoded?
UPDATE
Nachdem ich die fromPercentEncoding () - Hinweis, ich habe versucht folgenden code:
QUrl UrlFromUserInput(const QString& input)
{
QByteArray latin = input.toLatin1();
QByteArray utf8 = input.toUtf8();
if (latin != utf8)
{
//URL string containing unicode characters (no percent encoding expected)
return QUrl::fromUserInput(input);
}
else
{
//URL string containing ASCII characters only (assume possible %-encoding)
return QUrl::fromUserInput(QUrl::fromPercentEncoding(input.toLatin1()));
}
}
Dies ermöglicht dem Benutzer die Eingabe von unicode-URLs und Prozent-kodiert URLs und es möglich ist, zu Dekodieren, die beide Arten von URLs für die Anzeige/das matching. Aber die Prozent-codierte URLs funktionierte nicht in QWebView... der web-server reagiert anders (ist es wieder eine andere Seite). So offensichtlich QUrl::fromPercentEncoding() ist keine saubere Lösung, da es effektiv ändert sich die URL. Ich konnte erzeugen zwei QUrl Objekte in der oben genannten Funktion... man wurde direkt, man konstruiert mit fromPercentEncoding(), mit der ersten für QWebView und letzteres für die Anzeige/matching nur... aber das scheint absurd.
- Was meinst du, "warum geht es nicht"? Was erwarten Sie, es zu drucken?
- Ähnliche Frage - stackoverflow.com/questions/4815418/...
- Wenn Sie nicht finden können, hier eine Lösung, einfach eine E-Mail auf das Interesse @ qt-project.org mailing-Liste. QUrl maintaners sind extrem aktiv.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Abschluss
Ich habe einige der Forschung getan, das Fazit bisher ist: absurd.
QUrl::fromPercentEncoding()
ist der Weg zu gehen und das, was der OP getan hat, in der UPDATE Abschnitt haben sollte, wurde die akzeptierte Antwort auf die Frage im Titel.Ich denke, dass der Qt-Dokument von
QUrl::toDisplayString
ist ein wenig irreführend :Eigentlich nicht behaupten, Decodierung Fähigkeit, das Dokument hier ist unklar, es ist Verhalten. Aber zumindest die Passwort-Teil ist wahr. Ich habe einige Hinweise gefunden, die auf Gitorious:
Test-Code
Um zu erkennen, die Decodierung Möglichkeit, verschiedene Funktionen. Der folgende code wurde getestet auf Qt 5.2.1 (nicht getestet auf Qt 5.3 noch!)
QUrl::toEncoded
QUrl::url
,QUrl::toString
,QUrl::toDisplayString
,QUrl::fromPercentEncoding
P. S.
QUrl::url
ist nur synonym fürQUrl::toString
.Ausgang
[Fall 1]:, Wenn target path =
"%_%"
(testen Sie die Funktionalität der Codierung):[Fall 2]:, Wenn target path =
"Meow !"
(testen Sie die Funktionalität der Codierung):[Fall 3]:, Wenn target path =
"Meow|!"
(testen Sie die Funktionalität der Codierung):[Fall 4]:, Wenn target path =
"http://test.com/query?q=++e:xyz/en"
(keine % codiert):[Fall 5]:, Wenn target path =
"http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(% codiert):P. S. ich begegnen auch den bug, dass Ilya erwähnt in den Kommentaren: Prozent-Codierung scheint nicht zu arbeiten für '+' in QUrl
Zusammenfassung
Ergebnis
QUrl::toDisplayString
ist mehrdeutig. Wie das Dokument sagt, dieQUrl::FullyDecoded
- Modus muss mit Vorsicht verwendet werden. Egal, welche Art von URL, die Sie haben, Kodieren Sie durchQUrl::toEncode
und zeigt diese mitQUrl::fromPercentEncoding
wenn es nötig ist.Als für die Fehlfunktion der Prozent-codierte URLs in
QWebView
erwähnt in OP, mehr details sind notwendig, um zu Debuggen. Verschiedener Funktion und verschiedenen Modus verwendet, könnte der Grund sein.Hilfreiche Ressourcen
QUrl
ist nicht so allmächtig, wie andere moderne browser-decoder. In Ihrem Fall ist, können Sie nicht einfach verwendenQString
(Nutzers) zu tun Anzeige/matching Zeug und laden Sie es aufQUrl
nur, wennQWebView
braucht es?Können Sie
QUrlQuery::toString(QUrl::FullyEncoded)
oderQUrl::fromPercentEncoding()
für diese Umwandlung.Ich bin nicht sicher, warum
toDisplayString(QUrl::FullyDecoded)
funktioniert nicht.Nach dem Versuch mehrere Versionen, die ich gefunden habe, dass
copy.query(QUrl::FullyDecoded)
tut decodieren der query-Teil. Die Dokumentation hat ein Beispiel mit dem folgenden code wird die Rückkehr der dekodierten URL:Um das problem zu lösen, dieser Weg ist nicht optimal, da die Abfrage ein Teil kopiert wird, ohne not.