应该使用这两种方法中的哪一种来编码URL?
这取决于你实际想做什么 .
encodeURI假定输入是一个完整的URI,可能包含一些需要编码的字符 .
encodeURIComponent将对具有特殊含义的所有内容进行编码,因此您可以将其用于URI的组件,例如
var world = "A string with symbols & characters that have special meaning?"; var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);
如果要对字符串进行编码以放入URL组件(查询字符串参数),则应调用 encodeURIComponent .
encodeURIComponent
如果您要编码现有网址,请致电 encodeURI .
encodeURI
xkr.us有一个很好的讨论,有例子 . 引用他们的摘要:
escape()方法不对在服务器端解释为空格的字符进行编码,也不对由字段中包含空格的表单生成 . 由于这个缺点以及此函数无法正确处理非ASCII字符的事实,您应该尽可能避免使用escape() . 最好的选择通常是encodeURIComponent() . escape()不会编码:@ * /使用encodeURI()方法比escape()更专业,因为它编码URI而不是查询字符串,后者是URL的一部分 . 当您需要对要用于任何使用URI并且需要某些字符保持未编码的资源的字符串进行编码时,请使用此方法 . 请注意,此方法不对'字符进行编码,因为它是URI中的有效字符 . encodeURI()不会编码:〜!@#$&()=:/ ,;?最后,在编码URI的单个组件时,大多数情况下都应该使用encodeURIComponent()方法 . 此方法将编码某些字符,这些字符通常被识别为URI的特殊字符,因此可以包含许多组件 . 请注意,此方法不对'字符进行编码,因为它是URI中的有效字符 . encodeURIComponent()不会编码:〜!()'
encodeURIComponent():假定其参数是URI的一部分(例如协议,主机名,路径或查询字符串) . 因此,它会转义用于分隔URI部分的标点字符 .
encodeURI():用于编码现有的url
这是一个总结 .
不要使用它 .
当你的输入是像'https://searchexample.com/search?q=wiki'这样的完整网址时使用它
const queryStr = encodeURIComponent(someString)
encodeURIComponent(value) 主要用于编码queryString参数值,它对 value 中的每个适用字符进行编码 . encodeURI 忽略协议前缀( http:// )和域名 .
encodeURIComponent(value)
value
http://
在非常非常罕见的情况下,当您想要实现手动编码来编码其他字符时(尽管它们不需要在典型情况下编码),例如: ! * ,那么您可以使用:
! *
function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); }
(source)
其他答案描述了目的 . 以下是每个函数的字符 will actually convert :
control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F' + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F' + '\x7F' encodeURI (control + ' "%<>[\\]^`{|}' ) encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@' ) escape (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + "!'()~")
上面的所有字符都转换为百分比十六进制代码 . 空格到 %20 ,百分比到 %25 等 . 下面的字符不变 .
%20
%25
这是函数 will NOT convert 的字符:
pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' encodeURI (pass_thru + '#$&,:;=?' + '+/@' + "!'()~") encodeURIComponent(pass_thru + "!'()~") escape (pass_thru + '+/@' )
作为一般规则使用 encodeURIComponent . 唐't be scared of the long name thinking it'更具体的是's use, to me it'是更常用的方法 . 也可能不是你想要使用的东西,即使你在名字字段中使用"Fred"进行的简单测试有效,你会发现稍后当你使用更高级的文本时,比如添加一个&符号或标签,它就会失败 . 您可以查看其他答案,了解其原因 .
8 回答
这取决于你实际想做什么 .
encodeURI假定输入是一个完整的URI,可能包含一些需要编码的字符 .
encodeURIComponent将对具有特殊含义的所有内容进行编码,因此您可以将其用于URI的组件,例如
如果要对字符串进行编码以放入URL组件(查询字符串参数),则应调用
encodeURIComponent
.如果您要编码现有网址,请致电
encodeURI
.xkr.us有一个很好的讨论,有例子 . 引用他们的摘要:
encodeURIComponent():假定其参数是URI的一部分(例如协议,主机名,路径或查询字符串) . 因此,它会转义用于分隔URI部分的标点字符 .
encodeURI():用于编码现有的url
这是一个总结 .
不要使用它 .
当你的输入是像'https://searchexample.com/search?q=wiki'这样的完整网址时使用它
const queryStr = encodeURIComponent(someString)
encodeURI和encodeURIComponent之间的区别:
encodeURIComponent(value)
主要用于编码queryString参数值,它对value
中的每个适用字符进行编码 .encodeURI
忽略协议前缀(http://
)和域名 .在非常非常罕见的情况下,当您想要实现手动编码来编码其他字符时(尽管它们不需要在典型情况下编码),例如:
! *
,那么您可以使用:(source)
其他答案描述了目的 . 以下是每个函数的字符 will actually convert :
上面的所有字符都转换为百分比十六进制代码 . 空格到
%20
,百分比到%25
等 . 下面的字符不变 .这是函数 will NOT convert 的字符:
作为一般规则使用
encodeURIComponent
. 唐't be scared of the long name thinking it'更具体的是's use, to me it'是更常用的方法 . 也可能不是你想要使用的东西,即使你在名字字段中使用"Fred"进行的简单测试有效,你会发现稍后当你使用更高级的文本时,比如添加一个&符号或标签,它就会失败 . 您可以查看其他答案,了解其原因 .