为什么Uri不能处理www转义字符?

Why Uri can not handle www escape character?

我正在尝试解析一个 url,它的查询部分有 www 转义字符。代码如下

int main()
{
  init_apartment();
  Uri uri{L"http://fake.com/path?key1=val1&key2=val2"}; // A
  auto parsed = uri.QueryParsed();
  for(uint32_t idx = 0; idx<parsed.Size(); idx++)
  {
    auto ent = parsed.GetAt(idx);
    printf("%ws : %ws\n",ent.Name().data(),ent.Value().data());
  }
}

at A &#38;是&的转义符,看来Uri是处理不了这种情况的。预期输出为

key1 : val1
key2 : val2

但实际输出是

key1 : val1
 :

我该怎么办?在将 url 传递给 Uri 之前,我应该自己预处理它吗?非常感谢!

代码有 2 个问题:

解决前者很简单:只需将 &#38; 的部分替换为 %26 即可产生以下输出:

key1 : val1&key2=val2

这是正确的(预期的)结果。 API 不会(甚至不能)在解析过程中对 URI 进行转义。否则不可能有包含保留字符的值。请注意 Value() 确实 return 一个未转义的字符串。

如果您需要手动取消转义 URI,请使用 UnescapeComponent 静态 class 成员:

int main()
{
    init_apartment();

    auto const unescaped{
        Uri::UnescapeComponent(L"http://fake.com/path?key1=val1%26key2=val2")
    };
    Uri uri{ unescaped };

    auto const parsed{ uri.QueryParsed() };
    for (auto const& arg : parsed) {
        wprintf(L"%s : %s\n", arg.Name().c_str(), arg.Value().c_str());
    }
}

这会产生以下输出:

key1 : val1
key2 : val2