在我的应用程序中,我生成了一个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).
为什么会发生这种情况,我该如何避免?
在URL中,#
是一个从资源位置分隔'片段标识符'的字符。要用字面量#
引用file:
URL,需要对其进行转义(如%23
)。
字符"#"是不安全的,应该始终进行编码,因为它用于在万维网和其他系统中,将URL从片段/锚的标识符。
正如SteveTJS所指出的,为此目的提供了静态方法QUrl::fromLocalFile()
,因此您可以编写
QDesktopServices::openUrl(QUrl::fromLocalFile(file));
不是QDesktopServices::openUrl(QUrl(file));
这将
- 添加
file:
协议标识符和//
空主机名 - 将本地路径分隔符转换为
/
(如果不同) - 为URL编码任何不安全的字符
我刚刚找到了解决方案:
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