我应该使用encodeURI还是encodeURIComponent来编码URL?

应使用这两种方法中的哪一种来编码URL?

这取决于你实际想要做什么。

encodeURI假设input是一个完整的URI,可能有一些需要编码的字符。

encodeURIComponent将编码具有特殊含义的所有内容,因此可以将其用于URI的组件,例如

 var world = "A string with symbols & characters that have special meaning?"; var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world); 

如果你编码一个string来放入一个URL组件(查询string参数),你应该调用encodeURIComponent

如果您正在编码现有的URL,请调用encodeURI

http://xkr.us/articles/javascript/encode-compare/有一个很好的讨论,用例子。; 引用他们的总结:

“escape()方法不会对在服务器端被解释为空间的+字符进行编码,也不会在其字段中带有空格的表单生成。由于这个缺点以及这个函数无法处理非ASCII字符正确,你应该尽可能避免使用escape(),最好的select是encodeURIComponent()。

escape()不会编码:@ * / +

encodeURI()方法的使用比escape()更专门一些,因为它编码URI [REF]而不是作为URL一部分的查询string。 当您需要编码一个string以用于使用URI的任何资源并需要某些字符保持未编码时,请使用此方法。 请注意,此方法不会对“字符”进行编码,因为它是URI中的有效字符。

encodeURI()不会编码:〜!@#$&*()=:/,;?+'

最后,在编码URI的单个组件时,大多数情况下应该使用encodeURIComponent()方法。 这个方法会对通常被认为是URI的特殊字符的某些字符进行编码,这样就可以包含许多组件。 请注意,此方法不会对“字符”进行编码,因为它是URI中的有效字符。

encodeURIComponent()不会编码:〜!*()'“

encodeURIComponent():假定它的参数是URI的一部分(如协议,主机名,path或查询string)。 因此,它转义了用于分隔URI部分的标点符号。

encodeURI():用于编码现有的url

通常使用encodeURIComponent 。 不要害怕这个长名字,认为它是更具体的使用,对我来说这是更常用的方法。 也不要被用于encodeURI,因为你testing它,它似乎是正确的编码,这可能不是你的意思使用,即使你在简单的testing使用“弗雷德”在名字领域工作,你会发现稍后当您使用更高级的文本,如添加&符号或标签时,将会失败。 你可以看看其他的答案,为什么这是为什么。

如果你想要编码这些字符: ! ' * ) ( ! ' * ) (然后解决scheme是:

 function fixedEncodeURIComponent(str) { return encodeURIComponent(str).replace(/[!'()*]/g, function(c) { return '%' + c.charCodeAt(0).toString(16); }); } 

( 来源 )