首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >URI编码的URL将"%3D“更改为"%253D”

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

Stack Overflow用户
提问于 2011-02-01 01:51:48
回答 4查看 84.3K关注 0票数 14

我在将URL编码到URI时遇到了困难:

代码语言:javascript
运行
复制
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%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

已经坏了。例如,%3D变成了%253D --它似乎在对字符串中的%进行一些神秘的操作。

怎么回事我在这里做错什么了?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-01 02:13:39

首先将(已经转义的)字符串放入URL类中。任何东西都逃不掉。然后,您将提取URL的各个部分,这些部分无需任何进一步的处理就会返回它们(因此-自从您将它们放入其中时它们被转义后,它们仍然被转义)。最后,使用URI类将部分放入multi-argument constructor类中。此构造函数指定为使用百分比编码URI组件。

因此,在这最后一步,例如,":“变成"%3A”(好的),"%3A“变成"%253A”(坏的)。由于您正在放入已经编码的URL*,所以您不希望再次对它们进行编码。

因此,single-argument constructor of URI是你的朋友。它不转义任何东西,并要求您传递一个预转义字符串。因此,您根本不需要URL

代码语言:javascript
运行
复制
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的多参数构造函数帮助您完成的工作。

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

代码语言:javascript
运行
复制
uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(),
              uri.getPath(), uri.getQuery(), null)  // Remove fragment
票数 33
EN

Stack Overflow用户

发布于 2015-08-04 10:03:22

%3d means-> = (相等)

%253D -> = (等)小数6进制(字节) 3D

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

票数 6
EN

Stack Overflow用户

发布于 2011-02-01 02:04:16

当解析URL时,类没有解码%-序列,但是 URI 类正在对它们进行编码(再次)。使用URI 解析URL字符串.

Javadocs:

http://download.oracle.com/javase/6/docs/api/java/net/URL.html

类本身并不根据RFC2396中定义的转义机制对任何URL组件进行编码或解码。调用方有责任对调用URL之前需要转义的任何字段进行编码,并对从URL返回的任何转义字段进行解码。此外,因为URL不知道URL转义,所以它无法识别同一URL的编码或解码形式之间的等价性。例如,两个URL:

代码语言:javascript
运行
复制
http://foo.com/hello world/ and http://foo.com/hello%20world

将被认为是不平等的。注意,URI类确实在某些情况下执行其组件字段的转义。

管理URL编码和解码的推荐方法是使用URI,并使用toURI()和URI.toURL().在这两个类之间进行转换。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4858108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档