Javascript 是否应该使用encodeURI?
javascript的encodeURI函数有任何有效的用途吗 据我所知,当您尝试发出HTTP请求时,您应该:Javascript 是否应该使用encodeURI?,javascript,urlencode,Javascript,Urlencode,javascript的encodeURI函数有任何有效的用途吗 据我所知,当您尝试发出HTTP请求时,您应该: 完整的URI 您希望将某个片段放入URI中,该URI是unicode字符串或UTF-8字节序列 在第一种情况下,显然不需要做任何事情来请求它。注意:如果您确实希望将其作为参数传递(例如?url=http…),那么您实际上有一个第二种情况的实例,它看起来像一个URI 在第二种情况下,您应该始终将unicode字符串转换为UTF-8,然后在将其添加到URI之前调用encodeURICo
- 完整的URI
- 您希望将某个片段放入URI中,该URI是unicode字符串或UTF-8字节序列
我看到很多反对使用escape()的建议,但没有看到任何人反对使用escape()。我是否缺少有效的用法?encodeURI未对以下内容进行编码:,/?:@&=+$#而编码组件则会 您可能希望在encodeURI组件上使用encodeURI的原因有很多,例如将URL指定为变量值。您希望维护URL,但对路径、查询字符串和哈希值进行编码。使用encodeURIComponent会使URL无效。我有一个详细的例子来回答这个问题 您不应该使用
encodeURI
以编程方式构造URI,原因如下:您应该始终对各个组件使用encodeURIComponent
,然后将它们组合成一个完整的URI
encodeURI
最有用的地方是根据(“接受的内容要自由,发送的内容要保守”)来“清理”URI。如果有人给你一个完整的URI,它可能包含非法字符,如空格、某些ASCII字符(如双引号)和Unicode字符encodeURI
可用于将这些非法字符转换为合法的转义百分比序列,而无需编码分隔符。类似地,decodeURI
可以用于“漂亮地打印”URI,将转义序列的百分比显示为技术上非法的裸字符
例如,URL:
http://example.com/admin/login?name=Helen Ødegård&gender=f
这是非法的,但它仍然是完全明确的<代码>编码URI将其转换为有效的URI:
http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f
一个可能希望执行这种“URI清理”的应用程序示例是web浏览器。当您在地址栏中键入URL时,它应该尝试将任何非法字符转换为百分比转义,而不仅仅是出现错误。处理URI的软件(例如,希望获取页面超链接中所有URL的HTML刮板)也可能希望在任何URL在技术上非法的情况下应用这种清理
不幸的是,encodeURI
有一个严重的缺陷,即它会转义“%”字符,这使得它对URI清理毫无用处(它会加倍转义任何已经有百分比转义的URI)。因此,我借用了函数并对其进行了改进,使其能够正确地清理URI:
function fixedEncodeURI(str) {
return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']');
}
因此,您应该始终使用
encodeURIComponent
在内部构造URI。您不应该使用encodeURI
,但可以使用myFixedCodeUri
尝试“清理”从外部源(通常作为用户界面的一部分)提供的URI。您所说的“将URL指定为变量值”是什么意思?您的意思是在查询参数中包含URL作为值吗?如果您有一个url,如“”,并且希望将其作为查询参数传递,那么您肯定应该使用encodeURIComponent,因为encodeURI将无法转义“&”。很抱歉,这没有任何意义。为什么要更改字符串的值(这是JS中URI的值)以将其存储在变量中?如果您的意思是“在javascript源代码中表示它”,则需要使用引号转义(带反斜杠)和/或XML编码(带&…;)而不是URI编码。var csvBlob='data:text/csv',+encodeURI(csvString);
我认为,“您想放入URI的某个片段”可以称为“URI组件”。“在第二种情况下,您应该始终将unicode字符串转换为UTF-8”——而不是在JavaScript中。encodeURIComponent
将首先自动将字符串转换为UTF-8(和decodeURIComponent
将UTF-8八位字节转换回Unicode字符)。我看到(并同意)这里的用法,但我不相信encodeURI是您描述的实现。encodeURI将“%2F”转换为“%252F”,它通过双重转义部分URI来改变URI的含义。啊,你说得对。我更新了我的博客文章(搜索“编辑”)。其中包含一个名为FixedCodeUri的函数(从Mozilla借用并改进)这实际上是我最初描述的方式。实际的encodeURI函数,就目前而言,完全是垃圾。我编辑了答案以显示encodeURI中的缺陷,并建议了解决方法。