应该使用encodeURI吗?

时间:2012-02-12 00:29:26

标签: javascript urlencode

javascript的encodeURI函数是否有用?

据我所知,当您尝试发出HTTP请求时,您应该:

  • 完整的URI
  • 要放入URI的一些片段,可以是unicode字符串,也可以是UTF-8字节序列

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

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

假设我没有错过任何东西,我看不到encodeURI的有效用途。如果你使用它,很可能你构造了一个无效的URI,然后尝试在事后“消毒”它,这是不可能的,因为你不知道哪些字符是字面上的意图,哪些是打算转义的

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

2 个答案:

答案 0 :(得分:11)

我有一个blog post,可以很详细地回答这个问题。

您应该从不使用encodeURI以编程方式构建URI,因为您说 - 您应该始终对各个组件使用encodeURIComponent,然后组合它们到一个完整的URI。

encodeURI 几乎有用的地方在于“清理”URI,符合Postel's Law(“你接受的是自由主义,你发送的内容是保守的” 。)如果有人给你一个完整的URI,它可能包含非法字符,如空格,某些ASCII字符(如双引号)和Unicode字符。 encodeURI可用于将这些非法字符转换为合法的百分比转义序列,而无需编码分隔符。同样,decodeURI可用于“漂亮地打印”URI,将转义百分比的序列显示为技术上非法的裸字符。

例如,网址:

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清理”的应用程序示例是Web浏览器。当您在地址栏中键入URL时,它应该尝试将任何非法字符转换为percent-escapes,而不是仅仅出错。处理URI的软件(例如,想要获取页面上超链接中的所有URL的HTML scraper)也可能希望应用这种清理,以防任何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 :(得分:5)

encodeURI不编码以下内容:,/? :@& = + $#而encodeURIComponent确实。

为什么您可能希望在encodeURIComponent上使用encodeURI,例如将URL指定为变量值,有很多原因。您希望维护URL,但编码路径,查询字符串和哈希值。使用encodeURIComponent会使URL无效。