为什么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 &
是&的转义符,看来Uri是处理不了这种情况的。预期输出为
key1 : val1
key2 : val2
但实际输出是
key1 : val1
:
我该怎么办?在将 url 传递给 Uri 之前,我应该自己预处理它吗?非常感谢!
代码有 2 个问题:
- URI 正在使用 URI 中使用的 HTML character references. Those are unrelated to percent encoding。
- 它假定 API 自动取消转义转义序列。
解决前者很简单:只需将 &
的部分替换为 %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
我正在尝试解析一个 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 &
是&的转义符,看来Uri是处理不了这种情况的。预期输出为
key1 : val1
key2 : val2
但实际输出是
key1 : val1
:
我该怎么办?在将 url 传递给 Uri 之前,我应该自己预处理它吗?非常感谢!
代码有 2 个问题:
- URI 正在使用 URI 中使用的 HTML character references. Those are unrelated to percent encoding。
- 它假定 API 自动取消转义转义序列。
解决前者很简单:只需将 &
的部分替换为 %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