使用 boost url 以与平台无关的方式将绝对文件系统路径转换为文件 URI

问题描述 投票:0回答:1

问题 以与平台无关的方式将绝对文件系统路径转换为文件 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

您可以使用 https://www.urlencoder.org/

进行测试
c++ boost uri
1个回答
0
投票

该网站不会转换为 URI。无论输入如何,它都会进行 URL 编码。

链接的答案也表明不需要这样的编码。这些是有效的输出:

住在Coliru

#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

一体化链接:https://coliru.stacked-crooked.com/a/a945476e24a46f62

© www.soinside.com 2019 - 2024. All rights reserved.