URI编码的URL将“%3D”更改为“%253D”
我在将URL编码为URI时遇到问题:
mUrl = "A string url that needs to be encoded for use in a new HttpGet()";URL url = new URL(mUrl);
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(),
url.getQuery(), null);
这不能满足我对以下URL的期望:
http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2FBLM%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26qlt%3D90%
2C0%26layer%3Dcomp%26op_sharpen%3D0%26resMode%3Dsharp2%26op_usm%3D0.7%2C1.0%2C0.5%2C0%26fmt%3Djpeg&ttl
=
30d
http://m.bloomingdales.com/img?url=http%253A%252F%252Fimages.bloomingdales.com%252Fis%252Fimage%252FBLM%252Fproducts%252F3%252Foptimized%252F1140443_fpx.tif%253Fwid%253D52%2526qlt%253D90%
252C0%2526layer%253Dcomp%2526op_sharpen%253D0%2526resMode%253Dsharp2%2526op_usm%253D0.7%252C1.0%252C0.5%252C0%2526fmt%253Djpeg&ttl
=
30d
哪个坏了。例如,%3D
变成%253D
似乎对字符串中已存在的%进行了神秘的处理。
这是怎么回事,我在做什么错?
回答:
首先,将(已经转义的)字符串放入URL
类中。那没有逃脱。然后,您将取出的部分URL
,而无需进行进一步处理即可返回它们的部分(因此-
它们仍然是转义的,因为当您将它们放入时已经转义了)。最后,URI
使用多参数构造函数将各节放入类中。该构造函数被指定为使用百分比对URI组件进行编码。
因此,例如,在最后一步中,“ :
”变成“ %3A
”(好),而“ %3A
”变成“ %253A
”(差)。由于您要输入已经编码的URL
*,因此您不想再次对其进行编码。
因此,单参数的构造函数的URI
是你的朋友。它不会转义任何内容,并且要求您传递预转义的字符串。因此,您根本不需要URL
:
mUrl = "A string url is already percent-encoded for use in a new HttpGet()";URI uri = new URI(mUrl);
*唯一的问题是您的URL有时不是百分比编码的,有时是不是。然后,您有一个更大的问题。您需要确定程序是从始终编码的URL还是需要编码的URL开始。
请注意,有 没有这样的事情 作为一个完整的URL这是不是百分比编码。例如,您不能使用完整的URL“
http://example.com/bob&co
”并以某种方式将其转换为正确编码的URL“
http://example.com/bob%26co
”
–您如何分辨语法(不应转义)和字符(应避免转义)之间的区别)?这就是为什么单参数形式的URI
要求字符串已经转义的原因。如果您有未转义的字符串,则需要先对其进行百分比编码,然后
再将其 插入完整的URL语法中,这就是多参数构造函数URI
可以帮助您完成的工作。
我错过了原始代码丢弃该片段的事实。如果您要删除网址的片段(或其他任何部分),则可以URI
按照上述方法构造,然后根据需要拉出所有部分(它们将被 解码
为常规字符串),然后将它们传递回URI
多参数构造函数(将它们 重新编码 为URI组件):
uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), null) // Remove fragment
以上是 URI编码的URL将“%3D”更改为“%253D” 的全部内容, 来源链接: utcz.com/qa/436070.html