#结论
我做了一些研究,目前的结论是:absurd.
QUrl::fromPercentEncoding()
是要走的路,OP 在这方面做了什么UPDATE部分应该是标题问题的公认答案。
我认为Qt的文档QUrl::toDisplayString有点误导:
"返回 URL 的人类可显示的字符串表示形式。可以通过传递带有选项的标志来自定义输出。选项
RemovePassword 始终启用,因为密码永远不应该被删除
显示给用户。”
实际上它并没有声称有任何解码能力,这里的文档并不清楚它的行为。但至少密码部分是真的。我发现了一些线索吉托瑞斯:
"添加QUrl::toDisplayString(),即无密码的toString()。并修复 toString() 的文档,该文档说这是方法
用于向人类展示,但事实并非如此。”
#测试代码
以便辨别不同函数的解码能力。以下代码已经过测试Qt 5.2.1(尚未在 Qt 5.3 上进行测试!)
QString target(/*path*/);
QUrl url_path(target);
qDebug() << "[Original String]:" << target;
qDebug() << "--------------------------------------------------------------------";
qDebug() << "(QUrl::toEncoded) :" << url_path.toEncoded(QUrl::FullyEncoded);
qDebug() << "(QUrl::url) :" << url_path.url();
qDebug() << "(QUrl::toString) :" << url_path.toString();
qDebug() << "(QUrl::toDisplayString) :" << url_path.toDisplayString(QUrl::FullyDecoded);
qDebug() << "(QUrl::fromPercentEncoding):" << url_path.fromPercentEncoding(target.toUtf8());
-
返回 QByteArray: QUrl::toEncoded
-
返回QString: QUrl::url, QUrl::toString, QUrl::toDisplayString, QUrl::fromPercentEncoding
P.S. QUrl::url
只是同义词QUrl::toString
.
#Output
[情况1]:当目标路径 ="%_%"
(测试编码功能):
[Original String]: "%_%"
--------------------------------------------------------------------
(QUrl::toEncoded) : "%25_%25"
(QUrl::url) : "%25_%25"
(QUrl::toString) : "%25_%25"
(QUrl::toDisplayString) : "%25_%25"
(QUrl::fromPercentEncoding): "%_%"
【案例2】:当目标路径 ="Meow !"
(测试编码功能):
[Original String]: "Meow !"
--------------------------------------------------------------------
(QUrl::toEncoded) : "Meow%20!"
(QUrl::url) : "Meow !"
(QUrl::toString) : "Meow !"
(QUrl::toDisplayString) : "Meow%20!" // "Meow !" when using QUrl::PrettyDecoded mode
(QUrl::fromPercentEncoding): "Meow !"
【案例3】:当目标路径 ="Meow|!"
(测试编码功能):
[Original String]: "Meow|!"
--------------------------------------------------------------------
(QUrl::toEncoded) : "Meow%7C!"
(QUrl::url) : "Meow%7C!"
(QUrl::toString) : "Meow%7C!"
(QUrl::toDisplayString) : "Meow|!" // "Meow%7C!" when using QUrl::PrettyDecoded mode
(QUrl::fromPercentEncoding): "Meow|!"
【案例4】:当目标路径 ="http://test.com/query?q=++e:xyz/en"
(无 % 编码):
[Original String]: "http://test.com/query?q=++e:xyz/en"
--------------------------------------------------------------------
(QUrl::toEncoded) : "http://test.com/query?q=++e:xyz/en"
(QUrl::url) : "http://test.com/query?q=++e:xyz/en"
(QUrl::toString) : "http://test.com/query?q=++e:xyz/en"
(QUrl::toDisplayString) : "http://test.com/query?q=++e:xyz/en"
(QUrl::fromPercentEncoding): "http://test.com/query?q=++e:xyz/en"
【案例5】:当目标路径 ="http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(% 编码):
[Original String]: "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
--------------------------------------------------------------------
(QUrl::toEncoded) : "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(QUrl::url) : "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(QUrl::toString) : "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(QUrl::toDisplayString) : "http://test.com/query?q=%2B%2Be%3Axyz%2Fen"
(QUrl::fromPercentEncoding): "http://test.com/query?q=++e:xyz/en"
附:我还遇到了 Ilya 在评论中提到的错误:百分比编码似乎不适用于 QUrl 中的“+”
#Summary
的结果QUrl::toDisplayString
是模棱两可的。正如文件所说,QUrl::FullyDecoded模式必须谨慎使用。无论您获得什么类型的 URL,都通过以下方式对其进行编码QUrl::toEncode
并显示它们QUrl::fromPercentEncoding
必要时。
至于百分比编码 URL 的故障QWebView
OP中提到,需要更多细节来调试它。不同的功能和使用的模式可能是原因。
#有用的资源
-
RFC 3986(QUrl 符合)
- 编码表
- Gitorious 上 qurl.cpp 的来源