在 JavaScript 中编码 URL?

IT技术 javascript url encode urlencode
2020-12-16 16:41:04

如何使用 JavaScript 安全地对 URL 进行编码,以便将其放入 GET 字符串中?

var myUrl = "http://example.com/index.html?param=1&anotherParam=2";
var myOtherUrl = "http://example.com/index.html?url=" + myUrl;

我假设您需要myUrl在第二行变量进行编码

6个回答

查看内置函数encodeURIComponent(str)encodeURI(str)
在您的情况下,这应该有效:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
根据@CMSencodeURI对于 URL 编码并不是真正安全的。
2021-02-14 16:41:04
添加@cms给出的解释怎么样?escape也是一个有效的选择。
2021-02-17 16:41:04
@AnaelFavre因为它的目的是编码整个URL,即不允许的字符,例如:/@等不使用可互换的这2种方法,你必须知道你的编码使用正确的方法是什么。
2021-03-01 16:41:04
正如本页的另一个答案中提到的这个站点很好地详细说明了使用这种方法的原因
2021-03-08 16:41:04

您有三个选择:

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

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

  • encodeURIComponent() 不会编码: ~!*()'

但是在您的情况下,如果您想将URL传递GET其他页面参数中,您应该使用escapeencodeURIComponent,而不是encodeURI

有关进一步讨论请参阅堆栈溢出问题最佳实践:转义或 encodeURI / encodeURIComponent

用于转义的字符编码是可变的。坚持使用使用 UTF-8 的 encodeURI 和 encodeURIComponent。
2021-02-15 16:41:04
我正在使用 encodeURIComponent 并注意到它不会对管道字符进行编码 |
2021-02-25 16:41:04
当心。该转义将非 ASCII 字符转换为其 Unicode 转义序列,例如%uxxx.
2021-02-26 16:41:04
@GiovanniP:允许德语、法语、日语、中文、阿拉伯语字符作为输入并通过 GET 或 POST 传递这些参数的人。
2021-03-05 16:41:04
@kevzettler - 为什么要这样做?管道在 URI 中没有语义重要性。
2021-03-07 16:41:04

坚持encodeURIComponent()该函数encodeURI()不会对 URL 中具有语义重要性的许多字符(例如“#”、“?”和“&”)进行编码。escape()已弃用,并且不会对“+”字符进行编码,这些字符将被解释为服务器上的编码空格(并且,正如其他人所指出的,不能正确地对非 ASCII 字符进行 URL 编码)。

有一个很好的解释encodeURI()encodeURIComponent()其他地方之间的区别如果您想对某些内容进行编码,以便可以安全地将其包含为 URI 的组成部分(例如,作为查询字符串参数),您需要使用encodeURIComponent().

最好的答案是使用encodeURIComponent的查询字符串(和其他地方)。

但是,我发现许多 API 想要用“+”替换“”,所以我不得不使用以下内容:

const value = encodeURIComponent(value).replace('%20','+');
const url = 'http://example.com?lang=en&key=' + value

escape在不同的浏览器中以不同的方式实现,encodeURI并且不会编码很多字符(例如 # 甚至 /)——它被用于完整的 URI/URL 而不会破坏它——这不是非常有用或安全。

正如@Jochem 在下面指出的那样,您可能希望encodeURIComponent()在(每个)文件夹名称上使用,但无论出于何种原因,这些 API 似乎都不希望+在文件夹名称中使用,因此普通的旧版encodeURIComponent效果很好。

例子:

const escapedValue = encodeURIComponent(value).replace('%20','+');
const escapedFolder = encodeURIComponent('My Folder'); // no replace
const url = `http://example.com/${escapedFolder}/?myKey=${escapedValue}`;
@njzk2 不幸的encodeURIComponent('+')是会给你%2B,所以你必须使用两个正则表达式......我想这就是为什么会这样,因为'+'是'''最终的编码方式不同。
2021-02-07 16:41:04
请注意,您应该只在第一个问号(这是 URL 的“查询”部分)之后用 + 符号替换 %20。假设我想浏览到http://somedomain/this dir has spaces/info.php?a=this has also spaces. 它应该转换为:http://somedomain/this%20dir%20has%spaces/info.php?a=this%20has%20also%20spaces但许多实现允许查询字符串中的 '%20' 替换为 '+'。尽管如此,您不能在 URL 的路径部分中用 '+' 替换 '%20',这将导致未找到错误,除非您的目录带有+空格而不是空格。
2021-02-11 16:41:04
我会替换值而不是编码的结果
2021-02-14 16:41:04
@Jochem Kuijpers,当然,您不会将“+”放在目录中。我只会将其应用于查询参数值本身(或键,如果需要),而不是整个 URL,甚至整个查询字符串。
2021-02-15 16:41:04
没有理由将 %20 转换为“+”。ASCII 空间的有效转义序列是 %20,而不是 RFC 3986 ( tools.ietf.org/html/rfc3986 ) 中未提及的“+” “+”用于 1990 年代;它现在已过时,仅出于遗留原因才受支持。不要使用它。
2021-03-01 16:41:04

我建议使用qs npm 包

qs.stringify({a:"1=2", b:"Test 1"}); // gets a=1%3D2&b=Test+1

它更容易与 JS 对象一起使用,并且它为您提供了所有参数的正确 URL 编码

如果您使用 jQuery,我会选择$.param方法。它的 URL 编码一个对象映射字段到值,这比对每个值调用转义方法更容易阅读。

$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
我认为提供的例子就足够了。如果您需要有关api.jquery.com/jquery.param 上的$ .param 的更多信息
2021-02-09 16:41:04
qs 很棒,紧凑且有用的包。为后端的 qs 投票
2021-02-10 16:41:04
几乎每个人都使用 jQuery,我确实觉得用它比 encoreURIComponent 更舒服
2021-02-12 16:41:04