3

在我的应用程序中,我生成了一个要通过单击按钮打开的 HTML 文件。所以我的文件被命名,例如:

QString file = "F:/the_path/to_the_/generated_html_file.html";

在 Windows 上,我将其更改为:

file = "file:///F:/the_path/to_the_/generated_html_file.html";

这样我就可以打开它:

QDesktopServices::openUrl(QUrl(file));

并在默认浏览器中打开。

但是当该字符#出现在路径或文件名中时,它不再起作用,并且似乎 URL 在#.

例如,如果我命名文件generated#_html_file.html,我会收到以下错误消息:

ShellExecute 'F:/the_path/to_the_/generated' failed (error 2).

为什么会发生这种情况,我该如何避免呢?

4

2 回答 2

12

在 URL 中,#是一个将“片段标识符”与资源位置分隔开的字符。要使用文字 引用file:URL #,需要对其进行转义(如%23)。

参考:RFC 1738:

字符“#”是不安全的,应该始终进行编码,因为它在万维网和其他系统中用于将 URL 与可能跟随它的片段/锚标识符分隔开。

正如SteveTJSQUrl::fromLocalFile()所指出的,为此目的提供 了静态方法,因此您可以编写

QDesktopServices::openUrl(QUrl::fromLocalFile(file));

代替

QDesktopServices::openUrl(QUrl(file));

这将

  1. 预先添加file:协议标识符和//空主机名
  2. 将本机路径分隔符转换为/(如果不同)
  3. 对 URL 的任何非安全字符进行编码。
于 2015-07-22T13:03:32.427 回答
6

我刚刚找到了解决方案:

QString file = "F:/the_path/to_the_/generated#_html_file.html";
QUrl url = QUrl::fromLocalFile(file);
// gives url="file:///F:/the_path/to_the_/generated%23_html_file.html";
QDesktopServices::openUrl(url); //works
于 2015-07-22T13:04:04.120 回答