首先,将(已经转义的)字符串放入
URL类中。那没有逃脱。然后,您将取出的部分
URL,而无需进行进一步处理即可返回它们的部分(因此-
它们仍然是转义的,因为当您将它们放入时已经转义了)。最后,
URI使用多参数构造函数将各节放入类中。该构造函数被指定为使用百分比对URI组件进行编码。
因此,例如,在最后一步中,“
:”变成“
%3A”(好),而“
%3A”变成“
%253A”(差)。由于您要输入已经编码的URL
*,因此您不想再次对其进行编码。
因此,单参数的构造函数的
URI是你的朋友。它不会转义任何内容,并且要求您传递预转义的字符串。因此,您根本不需要
URL:
mUrl = "A string url is already percent-enpred 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



