在 JavaScript 中编码 URL?

问:

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

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

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

答1:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

查看内置函数 encodeURIComponent(str) 和 encodeURI(str)。在您的情况下,这应该可以工作:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

添加@cms给出的解释怎么样? escape 也是一个有效选项。

根据@CMS encodeURI 对于 URL 编码来说并不是很安全。

@AnaelFavre 因为它是为了对整个 URL 进行编码,它不允许使用 :、/、@ 等字符。这两种方法不能互换使用,你必须知道你在编码什么使用正确的方法。

另请参阅 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 和 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

如 in another answer on this page 所述,this site 很好地详细说明了使用此方法的原因

答2:

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

你有三个选择:

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

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

encodeURIComponent() 不会编码:~!*()’

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

有关进一步讨论,请参阅 Stack Overflow 问题Best practice: escape, or encodeURI / encodeURIComponent。

与转义一起使用的字符编码是可变的。坚持使用使用 UTF-8 的 encodeURI 和 encodeURIComponent。

当心。该转义将非 ASCII 字符转换为其 Unicode 转义序列,例如 %uxxx。

我正在使用 encodeURIComponent 并注意到它不会对管道字符进行编码 |

@kevzettler - 为什么要这样做?管道在 URI 中不具有语义重要性。

@GiovanniP:允许德语、法语、日语、中文、阿拉伯语字符作为输入并通过 GET 或 POST 传递这些参数的人。

答3:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

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

其他地方有一个不错的explanation of the difference between encodeURI() and encodeURIComponent()。如果您想对某些内容进行编码,以便可以安全地将其作为 URI 的一个组件包含在内(例如,作为查询字符串参数),您需要使用 encodeURIComponent()。

答4:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

最好的答案是在查询字符串中的 values 上使用 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}`;

请注意,您只能在第一个问号(即 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' 替换为 '+',这将导致 Not Found 错误,除非您的目录带有 + 而不是空格。

@Jochem Kuijpers,绝对不会将“+”放在目录中。我只会将其应用于查询参数值本身(或需要时的键),而不是整个 URL,甚至是整个查询字符串。

我会替换值而不是编码的结果

@njzk2 不幸的是 encodeURIComponent('+') 会给你 %2B,所以你必须使用两个正则表达式......我想这就是为什么这样做,因为 '+' 是 ' ' 最后编码不同。

没有理由将 %20 翻译成“+”。 ASCII 空间的有效转义序列是 %20,而不是 RFC 3986 (tools.ietf.org/html/rfc3986) 中未提及的“+”。 “+”用于 1990 年代;它现在已过时,仅出于遗留原因而受支持。不要使用它。

答5:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

我建议使用 qs npm package

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 的更多信息

几乎每个人都使用 jQuery,我确实觉得这个比 encoreURIComponent 更舒服

qs 很棒,紧凑且有用的包装。为后端的 qs 投票

答6:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

现代解决方案 (2021)

由于编写了其他答案,因此引入了 URLSearchParams API。它可以这样使用:

const queryParams = { param1: 'value1', param2: 'value2' }
const queryString = new URLSearchParams(queryParams).toString()
// 'param1=value1¶m2=value2'

它还对非 URL 字符进行编码。

对于您的具体示例,您可以像这样使用它:

const myUrl = “http://example.com/index.html?param=1&anotherParam=2”; const myOtherUrl = new URL(“http://example.com/index.html”); myOtherUrl.search = new URLSearchParams({url: myUrl}); console.log(myOtherUrl.toString());

here 和 here 也提到了此解决方案。

答7:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

encodeURIComponent() 是要走的路。

var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

但是您应该记住,与 php 版本 urlencode() 存在细微差别,正如@CMS 所提到的,它不会对每个字符进行编码。 http://phpjs.org/functions/urlencode/ 的人将 js 等同于 phpencode():

function urlencode(str) {
  str = (str + '').toString();

  // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
  // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
  return encodeURIComponent(str)
    .replace('!', '%21')
    .replace('\'', '%27')
    .replace('(', '%28')
    .replace(')', '%29')
    .replace('*', '%2A')
    .replace('%20', '+');
}

答8:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

如前所述,要对 URL 进行编码,您有两个函数:

encodeURI()

encodeURIComponent()

两者都存在的原因是,第一个保留了 URL,可能会留下太多未转义的内容,而第二个则对所需的所有内容进行编码。

首先,您可以将新转义的 URL 复制到地址栏中(例如),它会起作用。但是,未转义的 ‘&’ 会干扰字段分隔符,‘=’ 会干扰字段名称和值,并且 ‘+’ 看起来像空格。但是对于简单的数据,当您想要保留您正在转义的 URL 特性时,这是可行的。

第二个是您需要做的一切,以确保字符串中的任何内容都不会干扰 URL。它使各种不重要的字符未转义,以便 URL 尽可能保持人类可读而不受干扰。以这种方式编码的 URL 将不再作为 URL 而不转义它。

因此,如果您可以花时间,您总是希望使用 encodeURIComponent() - 在添加名称/值对之前,使用此函数对名称和值进行编码,然后再将其添加到查询字符串中。

我很难找到使用 encodeURI() 的理由——我会把它留给更聪明的人。

答9:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

我认为现在在 2022 年非常安全,您应该始终考虑使用 URL() interface 构建您的 URL。它会为你完成大部分工作。所以来到你的代码,

const baseURL = 'http://example.com/index.html';

const myUrl = new URL(baseURL);
myUrl.searchParams.append('param', '1');
myUrl.searchParams.append('anotherParam', '2');

const myOtherUrl = new URL(baseURL);
myOtherUrl.searchParams.append('url', myUrl.href);

console.log(myUrl.href);
// Outputs: http://example.com/index.html?param=1&anotherParam=2
console.log(myOtherUrl.href);
// Outputs: http://example.com/index.html?url=http%3A%2F%2Fexample.com%2Findex.html%3Fparam%3D1%26anotherParam%3D2
console.log(myOtherUrl.searchParams.get('url'));
// Outputs: http://example.com/index.html?param=1&anotherParam=2

或者…

const params = new URLSearchParams(myOtherUrl.search);

console.log(params.get('url'));
// Outputs: http://example.com/index.html?param=1&anotherParam=2

这样的事情保证不会失败。

答10:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

我用普通的javascript尝试过的类似的事情

function fixedEncodeURIComponent(str){
     return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}

答11:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

为防止双重编码,最好在编码之前对 url 进行解码(例如,如果您正在处理用户输入的 url,它可能已经编码)。

假设我们有 abc%20xyz 123 作为输入(一个空格已经编码):

encodeURI("abc%20xyz 123")            //   wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

原文链接:https://www.huntsbot.com/qa/eRAW/encode-url-in-javascript?lang=zh_CN&from=csdn

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值