我有一个博客文章 http://unspecified.wordpress.com/2012/02/12/how-do-you-escape-a-complete-uri/它非常详细地回答了这个问题。
你应该never use encodeURI
以编程方式构造 URI,出于您所说的原因 - 您应该始终使用encodeURIComponent
单独的组件,然后将它们组合成一个完整的 URI。
Where encodeURI
is almost有用的是“清理”一个 URI,根据波斯特尔定律 http://en.wikipedia.org/wiki/Robustness_principle(“接受的内容要自由,发送的内容要保守。”)如果有人给你一个完整的 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
Web 浏览器就是可能想要执行此类“URI 清理”的应用程序的一个示例。当您在地址栏中输入 URL 时,它应该尝试将任何非法字符转换为百分比转义符,而不仅仅是出现错误。处理 URI 的软件(例如,想要获取页面上超链接中的所有 URL 的 HTML 抓取工具)也可能希望应用这种清理,以防任何 URL 在技术上是非法的。
很遗憾,encodeURI
有一个严重的缺陷,那就是它会转义“%”字符,这使得它对于 URI 清理完全无用(它将对任何已经有百分比转义的 URI 进行双重转义)。因此我借了Mozilla 的fixedEncodeURI https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/encodeURI函数并对其进行了改进,以便它可以正确地清理 URI:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']');
}
所以你应该总是使用encodeURIComponent
在内部构造 URI。你永远不应该使用encodeURI
,但你可以用我的fixedEncodeURI
尝试“清理”从外部源(通常作为用户界面的一部分)提供的 URI。