javascript的encodeURI函数是否有用?
据我所知,当您尝试发出HTTP请求时,您应该:
在第一种情况下,显然没有什么需要做的来请求它。注意:如果您确实想将它作为参数传递(例如?url = http ...),那么您实际上有第二种情况的实例看起来像一个URI。
在第二种情况下,您应该始终将unicode字符串转换为UTF-8,然后在将其添加到URI之前调用encodeURIComponent以转义所有字符。 (如果您有UTF-8字节序列而不是unicode字符串,则可以跳过convert-to-utf8步骤。)
假设我没有错过任何东西,我看不到encodeURI的有效用途。如果你使用它,很可能你构造了一个无效的URI,然后尝试在事后“消毒”它,这是不可能的,因为你不知道哪些字符是字面上的意图,哪些是打算转义的
我已经看到很多反对使用escape()的建议,但是没有看到任何人阻止encodeURI。我错过了有效用途吗?
答案 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无效。