Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否应该使用encodeURI?_Javascript_Urlencode - Fatal编程技术网

Javascript 是否应该使用encodeURI?

Javascript 是否应该使用encodeURI?,javascript,urlencode,Javascript,Urlencode,javascript的encodeURI函数有任何有效的用途吗 据我所知,当您尝试发出HTTP请求时,您应该: 完整的URI 您希望将某个片段放入URI中,该URI是unicode字符串或UTF-8字节序列 在第一种情况下,显然不需要做任何事情来请求它。注意:如果您确实希望将其作为参数传递(例如?url=http…),那么您实际上有一个第二种情况的实例,它看起来像一个URI 在第二种情况下,您应该始终将unicode字符串转换为UTF-8,然后在将其添加到URI之前调用encodeURICo

javascript的encodeURI函数有任何有效的用途吗

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

  • 完整的URI
  • 您希望将某个片段放入URI中,该URI是unicode字符串或UTF-8字节序列
在第一种情况下,显然不需要做任何事情来请求它。注意:如果您确实希望将其作为参数传递(例如?url=http…),那么您实际上有一个第二种情况的实例,它看起来像一个URI

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

假设我没有遗漏任何东西,我就看不到encodeURI的有效用法。如果您使用它,很可能您构造了一个无效的URI,然后试图在事后对其进行“清理”,这是不可能的,因为您不知道哪些字符是字面意义上的,哪些是要转义的


我看到很多反对使用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
,但可以使用my
FixedCodeUri
尝试“清理”从外部源(通常作为用户界面的一部分)提供的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中的缺陷,并建议了解决方法。