将带有百分比编码的 QUrl 转换为字符串

2023-11-25

我使用用户输入的 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)?

UPDATE

得到 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,后者仅用于显示/匹配...但这似乎很荒谬。


#结论

我做了一些研究,目前的结论是: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 的故障QWebViewOP中提到,需要更多细节来调试它。不同的功能和使用的模式可能是原因。


#有用的资源

  1. RFC 3986(QUrl 符合)
  2. 编码表
  3. Gitorious 上 qurl.cpp 的来源
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将带有百分比编码的 QUrl 转换为字符串 的相关文章

  • 带 Qt 的菜单栏/系统托盘应用程序

    我是 Qt PyQt 的新手 我正在尝试制作一个应用程序 其功能将从菜单栏 系统托盘执行 这里展示了一个完美的例子 我找不到关于如何做到这一点的好资源 有人可以建议吗 Thanks 我认为您正在寻找与QMenu and QMainWindo
  • 我应该使用 QCoreApplication::processEvents() 还是 QApplication::processEvents()?

    我有一个从两者调用的方法QThreads和主线程 这个方法有时可能需要很长时间才能在循环中进行计算 所以我把QCoreApplication processEvents 这可以防止 GUI 冻结 在某个时刻我已经改变了QCoreApplic
  • 打开和关闭附加窗口 (QML)

    目前我有一个通过以下方式打开的窗口 property variant win Button id testButton MouseArea onClicked var component Qt createComponent test qm
  • Qt5和QML:如何使用WebEngine Quick Nano浏览器自动输入用户名和密码

    我正在使用编写一个小应用程序Qt and QML使用 Qt 文档中的示例WebEngine Quick Nano 浏览器 https doc snapshots qt io qt5 5 9 qtwebengine webengine qui
  • Qml 和模糊图像

    我想使用 QML 实现模糊效果 我找到了有关 效果 模糊 的参考资料 例子 http qt gitorious org lscunha qt components lscunha qt components blobs d78feec567
  • 如何在 Qt Creator 中编辑 QtWebKit 的右键上下文菜单?

    好吧 这是我的困境 我正在使用 Qt Creator 制作一个使用 Webkit 的简单应用程序 我认为 Qt Creator 会有一种简单的方法来使用信号和槽编辑器编辑右键单击上下文菜单 但事实证明这不是真的 我知道 webkit 有与上
  • 有没有办法向 QListView 添加部分?

    我正在使用 Qt5 2 和 C 来实现一个应用程序 需要显示一个列表 其中包含类似于下面的示例图像的部分 source ngo hung com http www ngo hung com files images contact list
  • 如何使用 Qt DOM 通过此语法获取 xml 属性

    我正在使用 Qt DOM XML 解析器 并且遇到了如下属性定义的问题
  • 用 C++/Qt 编写的程序中的 RTF / doc / docx 文本提取

    我正在写一些程序Qt https en wikipedia org wiki Qt 28software 29 C 我需要从中读取文本微软Word https en wikipedia org wiki Microsoft Word RTF
  • 在没有加载器的情况下实例化内联组件

    有没有办法实例化内联Component 即在同一文件中定义 而不使用Loader 我不太关心使用的性能影响Loader因为我要用很多东西污染我的文件Loader包装纸 我发现从 JavaScript 创建动态 QML 对象 http doc
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 使用 CMake 编译时更改头文件位置会导致缺少 vtable 错误

    对于一个大型 C 项目 我需要从 qmake 过渡到 CMake 但是在处理一个玩具示例时 我遇到了一些我不理解的行为 示例代码具有单个头文件 当该头文件移动到子目录中时 我收到 MainWindow 类缺少 vtable 的错误 CMak
  • 完全彻底卸载QT Creator

    问题 如何从 Linux 机器上卸载 QT Creator 我的 Debian Jessie 机器上的安装已损坏 我尝试过重新安装 修复等 但没有成功 建议我完全卸载 获取最新版本并重新安装 问题是我不确定如何执行此操作 每次我尝试时 QT
  • C++ SQL 查询构建库

    我正在寻找一个提供与 c SelectQueryBuilder 库类似功能的 c 库 http www codeproject com Articles 13419 SelectQueryBuilder Building complex a
  • 将 jstring 转换为 QString

    我正在调用一个返回字符串的 Java 函数 QAndroidJniObject obj QAndroidJniObject callStaticObjectMethod
  • 在 Qt 中使用多个不同的流读取同一文件

    使用 Qt 是否可以使用多个流读取文件以同时访问其中的不同数据部分 请注意 Qt 中的流 QTextStream QDataStream 不处理底层设备中的位置 流类只是一个包装器 用于更轻松地解析设备 QFile 实例 内的二进制数据 因
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • Qt:不完整类型和前向声明的使用无效

    我有一些误解 A h ifndef A H define A H include B h class A public B Q OBJECT public A endif A cpp include A h A A B ui gt blan
  • 在网站中呈现 URL 时如何避免双重 URL 编码?

    用户在文本输入中提供正确转义的 URL 和原始 URL 到我的网站 例如 我认为这两个 URL 是等效的 https www cool com cool 20beans https www cool com cool beans 现在我想将
  • PyQt4 信号和槽

    我正在使用 PyQt4 编写我的第一个 Python 应用程序 我有一个 MainWindow 和一个 Dialog 类 它是 MainWindow 类的一部分 self loginDialog LoginDialog 我使用插槽和信号 这

随机推荐

  • iPhone 上的 UIWebView 电话链接检测

    我的代码中有一些奇怪的东西 我肯定会忘记一些事情 但我不知道是什么 我尝试在 UIWebView 中处理电话 短信邮件和 http 链接 这就是我尝试的方法 1 实例化 UIWebView webview UIWebView alloc i
  • 如何在 ggplot2 的轴标签中同时使用上标和变量

    我想一起使用一个变量 此处为向量元素 类型 和一个在 n 轴标签内包含上标 此处为 m 2 的单位 data lt list houses data frame surface c 450 320 280 price c 12 14 6 f
  • 如何在Android UI线程中异步执行一些代码?

    我是 Android 开发新手 我从事 Swing 和 SWT 工作已有好几年了 Swing 和 SWT 都有在 UI 线程同步和异步执行代码的策略 典型的用法是在一个线程中执行一些耗时的工作 然后在 UI 线程异步中显示结果 所以我的问题
  • OpenCV 3.0上的GPU函数在哪里?

    据我了解 在 OpenCV 3 0 中 GPU 模块已被 CUDA 模块取代 或者更好的是它已被拆分为多个模块 So cv gpu GpuMat已被替换为cv cuda GpuMat fine 但是功能呢 例如 以下内容已移至 cv gpu
  • Jenkins 上的多个 JUnit XML 结果,用单独的图表发布?

    我有多个测试作为 Android Jenkins 构建的一部分运行 包括单元测试和功能测试 我能够在 Jenkins 上成功发布测试结果 但我想查看单元测试和功能测试的单独结果图 Jenkins JUnit 发布者仅显示多个 XML 文件的
  • 数组:array_shift($arr) 还是 $arr[0]?

    您会使用哪一个 基本上我只想从数组中获取第一个元素 就是这样 嗯 他们做不同的事情 array shift arr 从数组中取出第一个元素 并将其提供给您 arr 0 只是给你 if该数组有数字键 另一种也适用于关联数组的替代方法是rese
  • MSVC errno 线程安全

    Is errnoMSVC 线程安全吗 根据中的答案这个问题POSIX 要求errno是线程安全的 但 MSVC 可能不符合 POSIX 标准并且MSDN没有告诉任何有关线程安全的信息 MSDN 矛盾地提到errno被声明为extern in
  • Python 类构造函数中是否有 `self.somevariable = somevariable` 的快捷方式?

    Python 中的构造函数通常如下所示 class SomeClass def init self a b None c defC self a a self b b or self c c 有没有捷径 例如简单地定义 init self
  • 使用 RAR 压缩文件

    我有一个文本文件 我想在它达到指定大小后对其进行压缩 我已经看过了GZipStream效果很好 但 RAR 压缩要好得多 我一直在寻找一个可以的图书馆compress一个 RAR 文件 我真的不关心解压或解压缩 但我还没有找到 As the
  • 如何使用外部 .py 文件?

    我下载了 beautifulsoup py 用于我正在制作的一个小项目 我需要在我的项目中导入这个 py 文件吗 我是否只需将代码复制并粘贴到当前 python 脚本中的某个位置 感谢您的帮助 我发现了这个 但它没有说任何有关 Window
  • 将 pandas'to_html' 保存为文件

    我有一个 DataFrame tsod 现在我将其转换为 html tsod to html 我怎样才能将其保存为文件 最好另存为 html 文件 with open my file html w as fo fo write tsod t
  • 在 Azure databricks 中创建外部表

    我是 azure databricks 的新手 并尝试创建一个外部表 指向 Azure Data Lake Storage ADLS Gen 2 位置 在 databricks 笔记本中 我尝试设置 ADLS 访问的 Spark 配置 我仍
  • 将 google-cloud 与 webpack 集成时遇到问题

    我正在将 google cloud npm 包与我的 React 应用程序集成 并且我正在使用 firebase 我遇到的错误 google cloud hash stream validation index js 模块中的警告 未找到
  • 使用新身份验证方法的 Symfony 简单登录表单不起作用

    我在设置新的 symfony 应用程序时遇到问题 我确信它与新的基于身份验证器的安全系统有关 我安装了一个新的 symfony 应用程序 版本 5 3 6 安装安全包composer require symfony security bun
  • C 中的逻辑运算符

    我在尝试理解逻辑运算符在 C 中的工作原理时遇到了困难 我已经了解位级运算符的工作原理 而且我还知道逻辑运算符将非零参数视为代表 TRUE 将零参数视为代表 FALSE 但是假设我们有 0x65 0x55 我不明白这个操作为什么以及如何给出
  • Skype 在 imo.im 和 im+ 服务中如何工作?

    Skype 在 imo im 和 im 服务中如何工作 有什么猜测吗 我认为只有3个办法 为服务器上的每个连接客户端运行多个 Skype 客户端副本 从 Skype Kit 为服务器上的每个客户端运行多个运行时副本 Skype协议的逆向工程
  • LINQ GroupBy 连续时间

    假设我有一个如下所示的简单结构 public class Range public DateTime Start get set public DateTime End get set public Range DateTime start
  • 在所有设备上显示像素完美的画布

    我有一些画布 我想在每个 现代 浏览器中以像素完美的方式显示它们 默认情况下 具有高 DPI 屏幕的设备会缩放我的页面 以便所有内容看起来都大小正确 但它破坏了 我画布的外观 如何确保画布中的一个像素 屏幕上的一个像素 最好这不会影响页面上
  • .NET 跟踪不适用于 Diagnostics.TraceSource,仅适用于 Diagnostics.Trace

    我正在尝试设置 NET 跟踪 我可以通过 System Diagnostics Trace 进行基本跟踪 但由于复杂的原因 我必须通过 System Diagnostics TraceSource 对象 自 NET 2 0 以来的新方法 激
  • 将带有百分比编码的 QUrl 转换为字符串

    我使用用户输入的 URL 作为文本来初始化 QUrl 对象 稍后我想将 QUrl 转换回字符串以显示它并使用正则表达式检查它 只要用户不输入任何百分比编码的 URL 这种方法就可以正常工作 为什么下面的示例代码不起作用 qDebug lt