mgi*_*uca 29

您首先将(已经转义的)字符串放入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);
Run Code Online (Sandbox Code Playgroud)

*唯一的问题是,如果您的网址有时不是百分比编码,有时它们是.然后你有一个更大的问题.您需要确定您的程序是从一个始终编码的URL开始,还是需要编码的URL.

请注意,有没有这样的事情作为一个完整的URL这是不是百分比编码.例如,您无法获取完整的URL" http://example.com/bob&co",并以某种方式将其转换为正确编码的URL" http://example.com/bob%26co" - 您如何区分语法(不应该被转义)和字符(应该是)?这就是单参数形式URI要求字符串已经转义的原因.如果你有非转义字符串,你需要将它们插入完整的URL语法之前对它们进行百分比编码,这就是URI帮助你做的多参数构造函数.

编辑:我错过了原始代码丢弃片段的事实.如果你想删除URL的片段(或任何其他部分),你可以构造URI如上所述,然后根据需要拉出所有部分(它们将被解码为常规字符串),然后将它们传递回URI多个参数构造函数(它们将被重新编码为URI组件):

uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
              uri.getPath(), uri.getQuery(), null)  // Remove fragment
Run Code Online (Sandbox Code Playgroud)


Sar*_*tel 5

%3d表示- > = (等于)

%253D- > = (等于) 十进制6hex(字节)3D

CGI的%253D十六进制指示器:%3D