2012-02-12 42 views
8

javascript的encodeURI函数有没有任何有效的用法?应该encodeURI永远使用?

据我所知道的,当你试图做一个HTTP请求,你要么有:

  • 一个完整的URI
  • 要放置在一个URI,或者是一些片段一个unicode字符串或UTF-8字节序列

在第一种情况下,显然没有事情需要做任何事情来请求它。注意:如果你真的想把它作为参数传递(例如?url = http ...),那么你实际上有第二个情况的实例,看起来像是一个URI。

在第二种情况下,你应该始终 unicode字符串转换为UTF-8,然后调用encodeURIComponent方法将它添加到URI之前转义所有字符。 (如果你有一个UTF-8字节序列而不是unicode字符串,你可以跳过convert-to-utf8步骤)。

假设我没有错过任何东西,我不能看到是encodeURI有效使用。如果你使用它,很可能你已经构造了无效的URI,然后尝试的事实,这简直是不可能的,因为你不知道哪个字从字面上意后,“消毒”它,并意欲进行转义。

我已经看到了很多反对使用逃生()的建议,但没有看到任何阻碍是encodeURI。我错过了有效的用途吗?

+2

我相信,“您想放入URI中的某个片段”可以称为“URI组件”。 “在第二种情况下,您应该始终将unicode字符串转换为UTF-8” - 而不是JavaScript。 encodeURIComponent会自动将字符串转换为UTF-8(并且decodeURIComponent会将UTF-8八位字节转换回Unicode字符)。 – mgiuca 2012-02-12 08:00:37

回答

10

我有一个blog post,回答在很多细节这个问题。

你应该从未使用encodeURI构建一个URI编程,为你说的原因 - 你应该始终在各个组件使用encodeURIComponent,然后将它们组合成一个完整的URI。

哪里encodeURI几乎在“清洁”一个URI,按照Postel's Law(“在你接收的慷慨,并在你发送的保守”。)如果有人给你一个完整的URI是有用的,它可能包含非法字符,如空格,某些ASCII字符(如双引号)和Unicode字符。 encodeURI可用于将这些非法字符转换为合法的百分比转义序列,无需编码分隔符。类似地,decodeURI可用于“漂亮地打印”URI,将百分比转义的序列显示为技术上非法的裸露字符。

例如,URL:

http://example.com/admin/login?name=Helen Ødegård&gender=f 

是非法的,但它仍然是完全明确的。encodeURI它转换成有效的URI:

http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f 

可能想要做这种“URI清洁”的应用的一个例子是网络浏览器。当您在地址栏中键入一个URL时,它应该尝试将任何非法字符转换为百分号转义,而不仅仅是出现错误。处理URI的软件(例如,想要获取页面超链接中的所有URL的HTML刮板)也可能希望应用这种清理,以防任何URL在技术上非法。

不幸的是,encodeURI有一个严重缺陷,就是它转义了'%'字符,使得它完全没有用于URI清理(它将双重转义任何已经有百分号转义的URI)。因此,我借Mozilla's fixedEncodeURI功能和改进,以便它正确清洗的URI:

function fixedEncodeURI(str) { 
    return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']'); 
} 

所以,你应该总是使用encodeURIComponent到内部构造的URI。您应该永远不要使用encodeURI,但可以使用我的fixedEncodeURI来尝试“清理”从外部源(通常作为用户界面的一部分)提供的URI。

+1

我看到(并同意)这里的用法,但我并不确定encodeURI是您描述的实现。 encodeURI将“%2F”转换为“%252F”,它通过双重转义一些URI来改变URI的含义。 – gfxmonk 2012-02-12 09:52:45

+0

啊,你说得对。我更新了我的博文(搜索“编辑”)。它包含一个名为fixedEncodeURI的函数(从Mozilla借用并改进),其实际上的行为与我最初描述的方式相同。实际的encodeURI功能就是完全垃圾。 – mgiuca 2012-02-12 10:41:09

+0

我编辑了答案,以显示encodeURI中的缺陷,并提供了解决方法。 – mgiuca 2012-02-12 10:45:04

5

是encodeURI不编码如下:,/? :@ & = + $#而encodeURIComponent。

有很多原因,您可能需要使用是encodeURI超过encodeURIComponent方法,如作为变量值分配一个URL万千。你想维护URL但是编码路径,查询字符串和散列值。使用encodeURIComponent会使URL无效。

+1

“将URL分配为变量值”是什么意思?你的意思是在查询参数中包含一个URL作为值吗?如果你有一个像“http://example.com/?x=1&y=2”这样的url,并想将它作为查询参数传递,那么你肯定应该使用encodeURIComponent,因为encodeURI将无法转义“&”。 – gfxmonk 2012-02-12 03:35:00

+0

var x = myencodedurl; – 2012-02-12 18:09:33

+0

对不起,但这没有任何意义。为什么你会改变一个字符串的_value_(这就是JS中的URI),以便将它存储在一个变量中? – gfxmonk 2012-02-13 07:34:37