编码加号问题(执行 Poco::URI::setQueryParameters 和 Poco::URI::getQueryParameters 给出意外结果)
Issues with encoding plus sign (executing Poco::URI::setQueryParameters and Poco::URI::getQueryParameters gives unexpected result)
假设我有一个带值的 URI 参数,其中包含加号 (+
) 和其他特殊字符。
当我执行 URI::setQueryParameters
然后 URI::getQueryParameters
时,结果值与原始值不同 - 所有特殊字符都可以,加号除外。
请问,常规方法是什么?
解决方法: 使用包含加号的 reserved
显式调用 URI::encode
。但这似乎不对,它确实看起来像一个解决方法。
无论如何,如果这是实现此目的的正确方法,我应该在 reserved
中包含哪些符号,如果我想避免将来出现此类意外情况?
其他观察: URI::decode
有一个名为 plusAsSpace
的参数(默认为 false
),但这没有帮助。 URI::getQueryParameters
在调用 URI::decode
.
之前将 +
替换为 </code> (space)
<hr>
<p>这是一个示例代码:</p>
<pre><code>const std::string value_with_plus_signs = "value+with+plus+signs";
Poco::URI::QueryParameters out_params;
out_params.push_back(std::make_pair("param", value_with_plus_signs));
Poco::URI uri("path");
uri.setQueryParameters(out_params);
const auto in_params = uri.getQueryParameters();
std::cout << "Expected: '" << value_with_plus_signs << "', received: '"
<< in_params.front().second << "'" << std::endl;
输出:Expected: 'value+with+plus+signs', received: 'value with plus signs'
这似乎已在 Poco 中修复(请注意,“+”已添加到默认编码的符号中):
https://github.com/pocoproject/poco/issues/1260
https://github.com/pocoproject/poco/commit/c32e683b6c00950ddfce817dfe8f3fc0b6846455
我用 poco 1.7.9p2 测试了你的代码,得到了正确的结果。
假设我有一个带值的 URI 参数,其中包含加号 (+
) 和其他特殊字符。
当我执行 URI::setQueryParameters
然后 URI::getQueryParameters
时,结果值与原始值不同 - 所有特殊字符都可以,加号除外。
请问,常规方法是什么?
解决方法: 使用包含加号的 reserved
显式调用 URI::encode
。但这似乎不对,它确实看起来像一个解决方法。
无论如何,如果这是实现此目的的正确方法,我应该在 reserved
中包含哪些符号,如果我想避免将来出现此类意外情况?
其他观察: URI::decode
有一个名为 plusAsSpace
的参数(默认为 false
),但这没有帮助。 URI::getQueryParameters
在调用 URI::decode
.
+
替换为 </code> (space)
<hr>
<p>这是一个示例代码:</p>
<pre><code>const std::string value_with_plus_signs = "value+with+plus+signs";
Poco::URI::QueryParameters out_params;
out_params.push_back(std::make_pair("param", value_with_plus_signs));
Poco::URI uri("path");
uri.setQueryParameters(out_params);
const auto in_params = uri.getQueryParameters();
std::cout << "Expected: '" << value_with_plus_signs << "', received: '"
<< in_params.front().second << "'" << std::endl;
输出:Expected: 'value+with+plus+signs', received: 'value with plus signs'
这似乎已在 Poco 中修复(请注意,“+”已添加到默认编码的符号中):
https://github.com/pocoproject/poco/issues/1260 https://github.com/pocoproject/poco/commit/c32e683b6c00950ddfce817dfe8f3fc0b6846455
我用 poco 1.7.9p2 测试了你的代码,得到了正确的结果。