问题 以与平台无关的方式将绝对文件系统路径转换为文件 URI 已经六岁了,现在我们有了 boost url https://www.boost.org/doc/libs/1_85_0/libs/url/doc/html/index.html.
是否可以用boost url转换abs路径? 我尝试过这样的例子:
boost::url u;
u.set_scheme( "file" );
u.set_path( "c:/path/to/file.txt" );
cout << u << "\n";
结果是:
文件:c:/path/to/file.txt
但应该是:
文件:///c%3A%2Fpath%2Fto%2Ffile.txt
进行测试该网站不会转换为 URI。无论输入如何,它都会进行 URL 编码。
链接的答案也表明不需要这样的编码。这些是有效的输出:
#include <boost/url.hpp>
#include <iostream>
int main() {
boost::url url;
url.set_scheme("file");
url.set_query("c:/path/to/file.txt");
std::cout << url << std::endl;
std::cout << " - scheme: " << url.scheme() << std::endl;
std::cout << " - authority: " << url.authority() << std::endl;
std::cout << " - path: " << url.path() << std::endl;
std::cout << " - query: " << url.query() << std::endl;
std::cout << " - fragment: " << url.fragment() << std::endl;
url.set_host("localhost");
std::cout << url << std::endl;
std::cout << " - scheme: " << url.scheme() << std::endl;
std::cout << " - authority: " << url.authority() << std::endl;
std::cout << " - path: " << url.path() << std::endl;
std::cout << " - query: " << url.query() << std::endl;
std::cout << " - fragment: " << url.fragment() << std::endl;
}
你可以一直坚持做你想做的事(即使这可能不是正确的事情):
boost::urls::encoding_opts opt;
// opt.space_as_plus = true;
std::string s = boost::urls::encode("c:/path/to/file.txt", [](uint8_t ch) { return std::isalnum(ch); });
std::cout << "Forced: " << s << std::endl;
这不会创建等效的 URI,但会打印您给出的示例:
Forced: c%3A%2Fpath%2Fto%2Ffile%2Etxt
请注意,由于您不遵守此处的任何 URL 规范,因此由您决定哪些字符实际上是未保留的:
std::cout << "Unreserved: " << boost::urls::encode(p, boost::urls::unreserved_chars) << std::endl;
std::cout << "All: " << boost::urls::encode(p, [](auto) { return false; }) << std::endl;
std::cout << "Non-punctuation: "
<< boost::urls::encode(p, [](uint8_t ch) { return ch != '%' && std::ispunct(ch); });
打印
Unreserved: c%3A%2Fpath%2Fto%2Ffile.txt
All: %63%3A%2F%70%61%74%68%2F%74%6F%2F%66%69%6C%65%2E%74%78%74
Non-punctuation: %63:/%70%61%74%68/%74%6F/%66%69%6C%65.%74%78%74