当前位置: 首页 > 面试题库 >

URI编码的URL将“%3D”更改为“%253D”

吴飞语
2023-03-14
问题内容

我在将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


 类似资料:
  • 问题内容: 在W3 Schools URL编码网页 上看到,它说应该被编码为,并且应该被编码为。 我已经尝试了和,但是上述方法都没有正确执行: 由于某些原因,电子邮件地址正确但不能空格,并且货币而不是电子邮件地址。 我应该如何编码这两个参数,以与w3schools所说的正确(或w3schools错误)相一致? 问题答案: 尽管我认为@fge的答案是正确的,但是由于我使用的是基于W3Schools文

  • 我试图找到一种方法,可以将WinAnsiEncoding更改为Unicode,我试着像这样设置字体, 对于简单的文本,这很好,我可以看到Helvetica的字体变化,但是如果文本包含UTF-8字符(例如,U+0083等),我只会看到抛出以下异常, java.lang.IllegalArgumentException:U+0083在此字体的编码中不可用:WinAnsiEncoding org.apa

  • 问题内容: 我有一个返回XML的API,它实际上是使用默认编码返回的(我相信它是UTF-8),但是现在需求已经改变,我们需要以UTF-16LE返回所有内容。 我的问题是:是否有一种简单的方法?我可以在通话结束之前访问响应,所以我想知道是否可以做类似的事情 非常感谢! 更新:提到的方法是一种使用。 我使用的是不包含它的servlet API的旧版本(2.3)。更改版本可以解决所有问题。 问题答案:

  • 我正在使用带有Selenium的testNG。我有两种记录器,一种是log4j记录器,另一种是testNG reporter.log()。现在的问题是我需要记录一些中文文本。但它是作为‘????’而不是中文文本。所以我更改了log4j.properties文件,只添加了两行: 现在,在我的log4j日志中,它是正确的,但在testNG Reporter.log()中,它仍然是“?????”。

  • 默认情况下,当您将命令的输出重定向到文件或通过管道将其导入PowerShell中的其他内容时,编码是UTF-16,这是不有用的。我想把它改成UTF-8。 可以通过将语法替换为来逐个实现,但每次都要重复这样做会很尴尬。 在PowerShell中设置东西的持久方法是将它们放在中;我已经验证了这个文件确实是在启动时执行的。 曾经说过,可以使用设置输出编码,但我尝试过,没有效果。 https://blog

  • 问题内容: 我想知道是否有任何方法可以解析这样的URL: 进入 类似于Firefox进行的URL重写,即仅粘贴以前的URL,然后将其发送到服务器(除非有这样的站点,否则没有响应),然后从导航栏中复制URL并将其粘贴到其他位置。 使用给我这个(不需要的)输出: 不幸的是,我收到问题开头所示的字符串,因此直接使用不起作用。 我天真地尝试了这个: 并给出以下(更好的)输出: 但是我不确定是否有针对此问题