gpt4 book ai didi

qt - 将百分比编码的 QUrl 转换为字符串

转载 作者:行者123 更新时间:2023-12-01 23:56:25 25 4
gpt4 key购买 nike

我使用用户输入的 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 中不起作用...网络服务器的响应不同(它返回了不同的页面)。显然 QUrl::fromPercentEncoding() 不是一个干净的解决方案,因为它有效地改变了 URL。我可以在上面的函数中创建两个 QUrl 对象...一个直接构造,一个使用 fromPercentEncoding() 构造,第一个用于 QWebView,后者仅用于显示/匹配...但这似乎很荒谬。

最佳答案

#结论

我做了一些研究,到目前为止的结论是:荒谬

QUrl::fromPercentEncoding() 是要走的路,OP 在 UPDATE 部分中所做的应该是标题中问题的可接受答案。

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

"Returns a human-displayable string representation of the URL. The output can be customized by passing flags with options. The optionRemovePassword is always enabled, since passwords should never beshown back to users."

实际上它并没有声称有任何解码能力,这里的文档并不清楚它的行为。但至少密码部分是真的。我在Gitorious:上找到了一些线索

"Add QUrl::toDisplayString(), which is toString() without password. And fix documentation of toString() which said this was the method touse for displaying to humans, while this has never been true."

<小时/>

#测试代码以便辨别不同函数的解码能力。以下代码已在 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());

附注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]:当目标路径= “喵!”时(测试编码功能):

[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 在评论中提到的错误:Percent Encoding doesn't seem to be working for '+' in QUrl

<小时/>

#摘要

QUrl::toDisplayString 的结果不明确。正如文件所述,QUrl::FullyDecoded模式必须谨慎使用。无论您获得什么类型的 URL,都可以通过 QUrl::toEncode 对其进行编码,并在必要时使用 QUrl::fromPercentEncoding 显示它们。

关于OP中提到的QWebView中百分号编码的URL故障,需要更多细节来调试。不同的功能和使用不同的模式可能是原因。

<小时/>

#有用的资源

  1. RFC 3986 (QUrl 符合)
  2. Encode table
  3. Source of qurl.cpp on Gitorious

关于qt - 将百分比编码的 QUrl 转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24343582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com