我使用用户输入的URL作为文本来初始化QUrl对象。稍后,我想将QUrl转换回字符串以显示它,并使用正则表达式进行检查。只要用户不输入任何百分比编码的URL,此方法就可以正常工作。

为什么以下示例代码不起作用?

qDebug() << QUrl("http://test.com/query?q=%2B%2Be%3Axyz%2Fen").toDisplayString(QUrl::FullyDecoded);

它根本不会解码任何百分比编码的字符。它应该打印"http://test.com/query?q=++e:xyz/en",但实际上会打印"http://test.com/query?q=%2B%2Be%3Axyz%2Fen"

我也尝试了许多其他方法,例如fromUserInput(),但无法使代码在Qt5.3中正常工作。

有人可以解释我该怎么做,以及即使使用QUrl::FullyDecoded时,上述代码为何也不起作用(即显示解码后的URL)?

更新

得到fromPercentEncoding()提示后,我尝试了以下代码:
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()));
   }
}

这允许用户输入unicode URL和百分比编码的URL,并且可以对两种URL进行解码以进行显示/匹配。但是,百分比编码的URL在QWebView中不起作用... Web服务器的响应不同(它返回了不同的页面)。显然,QUrl::fromPercentEncoding()并不是一个干净的解决方案,因为它可以有效地更改URL。我可以在上面的函数中创建两个QUrl对象...一个直接构造,一个使用fromPercentEncoding()构造,第一个用于QWebView,第二个仅用于显示/匹配...但是这似乎很荒谬。

最佳答案

结论

我已经进行了一些研究,到目前为止的结论是:荒谬的
QUrl::fromPercentEncoding()是必经之路,OP在 UPDATE 部分中所做的事情应该是标题问题的公认答案。

我认为Qt的 QUrl::toDisplayString 文档有点误导性:



实际上,它没有任何解码能力,此处的文档尚不清楚其行为。但是至少密码部分是正确的。我发现了关于Gitorious:的一些线索



测试代码

为了辨别不同功能的解码能力。以下代码已在 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的同义词。

    输出

    [案例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"
    

    P.S.我还遇到了Ilya在评论中提到的错误:Percent Encoding doesn't seem to be working for '+' in QUrl

    概括
    QUrl::toDisplayString的结果是不明确的。如文档所述,必须谨慎使用 QUrl::FullyDecoded 模式。无论您使用哪种类型的URL,都必须使用QUrl::toEncode对其进行编码,并在必要时使用QUrl::fromPercentEncoding显示它们。

    至于OP中提到的QWebView中的百分比编码URL的故障,需要更多详细信息来对其进行调试。原因可能是所使用的功能和模式不同。

    有用的资源
  • RFC 3986(符合QUrl)
  • Encode table
  • Source of qurl.cpp on Gitorious
  • 关于qt - 将具有百分比编码的QUrl转换为字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24343582/

    10-10 14:14