我在URIBuilder中遇到字符+
(也许是其他人)的问题是假设要获取已解码的网址,但是当我提取查询时,+
被替换
String decodedUrl = "www.foo.com?sign=AZrhQaTRSiys5GZtlwZ+H3qUyIY=&more=boo";
URIBuilder builder = new URIBuilder(decodedUrl);
List<NameValuePair> params = builder.getQueryParams();
String sign = params.get(0).getValue();
sing的值为AZrhQaTRSiys5GZtlwZ H3qUyIY=
,而空格为+
。如何提取正确的值?
其他方式是:
URI uri = new URI(decodedUrl);
String query = uri.getQuery();
在这种情况下,查询的值是sign=AZrhQaTRSiys5GZtlwZ+H3qUyIY=&more=boo
是正确的,但我必须删除它。还有另一种方法吗?
答案 0 :(得分:2)
以不同方式使用:
String decodedUrl = "www.foo.com";
URIBuilder builder = new URIBuilder(decodedUrl);
builder.addParameter("sign", "AZrhQaTRSiys5GZtlwZ+H3qUyIY=");
builder.addParameter("more", "boo");
List<NameValuePair> params = builder.getQueryParams();
String sign = params.get(0).getValue();
addParameter方法负责为构建器添加参数。构建器的构造函数应仅包含基本URL。
如果这个URL按原样给出,则+已经解码并代表空格字符。如果您是生成此URL的人,则可能会跳过URL编码步骤(可以使用上面提到的代码完成)。
了解一下网址编码:http://en.wikipedia.org/wiki/Query_string#URL_encoding
答案 1 :(得分:1)
这是因为如果您在url中将空格作为参数发送,则会将其编码为+
。发生这种情况是因为在URL中有一些字符有效的规则。请参阅URL RFC。
必须使用“%”字符后跟两个十六进制数字的标准约定对URL中不允许的任何字符进行编码,包括不在允许字符集中的空格和其他二进制数据。
如果您想在网址中使用+
作为符号,则需要将其编码为%2B
。例如,2+2
编码为2%2B2
,i am
编码为i+am
。因此,在您的情况下,我认为您必须更正结果,因为AZrhQaTRSiys5GZtlwZ+H3qUyIY
会解码为AZrhQaTRSiys5GZtlwZ H3qUyIY
。