你什么时候应该使用escape而不是encodeURI / encodeURIComponent?

IT技术 javascript encoding query-string
2021-01-31 02:37:26

当编码要发送到网络服务器的查询字符串时 - 您escape()何时使用以及何时使用encodeURI()or encodeURIComponent()

使用转义:

escape("% +&=");

或者

使用 encodeURI() / encodeURIComponent()

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");
6个回答

逃脱()

不要使用它! escape()B.2.1.2节中定义了转义,附件 B介绍文本说:

... 本附件中指定的所有语言特性和行为都有一个或多个不受欢迎的特征,如果没有遗留用法,将从本规范中删除。...
... 程序员在编写新的 ECMAScript 代码时不应该使用或假设这些特性和行为的存在......

行为:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

特殊字符编码除外:@*_+-./

编码单元值为 0xFF 或更小的字符的十六进制形式是一个两位数的转义序列:%xx.

对于具有更大代码单元的字符,%uxxxx使用四位格式这在查询字符串中是不允许的(如RFC3986 中所定义):

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

百分号只允许在它后面直接跟两个十六进制数字,百分比后面u是不允许的。

编码URI()

当您需要工作 URL 时,请使用 encodeURI。打这个电话:

encodeURI("http://www.example.org/a file with spaces.html")

要得到:

http://www.example.org/a%20file%20with%20spaces.html

不要调用 encodeURIComponent 因为它会破坏 URL 并返回

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

请注意,encodeURI 与 encodeURIComponent 一样,不会对 ' 字符进行转义。

编码URI组件()

当您想对 URL 参数的值进行编码时,请使用 encodeURIComponent。

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

然后你可以创建你需要的 URL:

var url = "http://example.net/?param1=" + p1 + "&param2=99";

你会得到这个完整的 URL:

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

请注意, encodeURIComponent 不会对'字符进行转义一个常见的错误是使用它来创建 html 属性,例如href='MyUrl',这可能会遭受注入错误。如果您从字符串构造 html,请使用"而不是'用于属性引号,或者添加额外的编码层('可以编码为 %27)。

有关此类编码的更多信息,您可以查看:http : //en.wikipedia.org/wiki/Percent-encoding

当然,除非您尝试将 URL 作为 URI 组件传递,在这种情况下调用 encodeURIComponent。
2021-03-14 02:37:26
@Francois escape() 对除字母、数字和 *@-_+./ 之外的低 128 个 ASCII 字符进行编码,而 unescape() 与 escape() 相反。据我所知,它们是为编码 URL 设计的遗留函数,并且仍然只是为了向后兼容而实现的。通常,除非与为它们设计的应用程序/网络服务/等交互,否则不应使用它们。
2021-03-19 02:37:26
@Eric 它不编码单引号,因为单引号是一个完全有效的字符,出现在 URI ( RFC-3986 ) 中。当您在 HTML 中嵌入 URI 时会出现问题,其中单引号不是有效字符。因此,在将 URI放入 HTML 文档之前,URI 也应该是“HTML 编码的”(将替换'')。
2021-03-22 02:37:26
为什么它不处理单引号?
2021-03-23 02:37:26
@Francois,根据接收服务器的不同,它可能无法正确解码转义如何编码高位 ASCII 或非 ASCII 字符,例如:âầẩẫấậêềểễếệ 例如,如果通过转义编码,Python 的 FieldStorage 类将无法正确解码上述字符串。
2021-04-09 02:37:26

encodeURI()之间的区别encodeURIComponent()正好是由 encodeURIComponent 编码而不是由 encodeURI 编码的 11 个字符:

包含 encodeURI 和 encodeURIComponent 之间的十个差异的表

使用以下代码在谷歌浏览器中使用console.table轻松生成了这个表

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);

@bladnman encodeURI 和 encodeURIComponent 在所有主要浏览器中都应该以这种方式工作。您可以在 Chrome 和 Firefox 中测试上述代码,因为它们都支持 console.table。在其他浏览器(包括 Firefox 和 Chrome)中,您可以使用以下代码:var arr=[]; for(var i=0;i<256;i++){var char=String.fromCharCode(i); if(encodeURI(char)!==encodeURIComponent(char)) console.log("character: "+char + " | encodeURI: " +encodeURI(char) + " |encodeURIComponent: " + encodeURIComponent(char) ) }
2021-03-10 02:37:26
我需要多次投票!不幸的是只能投票一次。
2021-03-26 02:37:26
嘿,我看不到任何结果
2021-03-27 02:37:26
@Pacerier 在各种浏览器中应该是相同的,除非原始规范太模糊……另见stackoverflow.com/questions/4407599/……
2021-03-30 02:37:26
这不是依赖浏览器吗?
2021-04-02 02:37:26

我发现这篇文章很有启发性: Javascript Madness: Query String Parsing

当我试图理解为什么 decodeURIComponent 没有正确解码“+”时,我发现了它。这是一个摘录:

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!
您链接到的文章包含很多废话。在我看来,作者本人并没有理解这些函数的正确用途......
2021-03-14 02:37:26
@Christoph 这一切对我来说都是合理的。特别是,我同意他的看法,它encodeURI似乎只在相当模糊的边缘情况下才有用,实际上不需要存在。我和他有一些不同意见,但我没有看到任何完全错误或愚蠢的东西。你究竟认为什么是无稽之谈?
2021-03-22 02:37:26
元素enctype属性FORM指定用于对提交到服务器的表单数据集进行编码的内容类型。 application/x-www-form-urlencoded 这是默认的内容类型。使用此内容类型提交的表单必须按如下方式编码:[...]空格字符替换为“+”,并且 [...] 非字母数字字符替换为“%HH”,[...] 参考:HTML4 Sepc
2021-03-28 02:37:26
encodeURIComponent('A + B').replace(/\%20/g, '+') + '\n' + decodeURIComponent("A+%2B+B".replace(/\+/g, '%20' ));
2021-04-09 02:37:26

encodeURIComponent 不编码-_.!~*'(),导致在 xml 字符串中将数据发布到 php 时出现问题。

例如:
<xml><text x="100" y="150" value="It's a value with single quote" /> </xml>

一般逃生 encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

你可以看到,单引号没有被编码。为了解决问题,我创建了两个函数来解决我的项目中的问题,用于编码 URL:

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

对于解码 URL:

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}
它也不执行 #(磅/哈希/数字)符号,即 %23。
2021-03-20 02:37:26
@xr280xr 你是什么意思?encodeURIComponent确实将 # 编码为 %23(也许在 2014 年没有?)
2021-04-03 02:37:26

encodeURI() - escape() 函数用于 javascript 转义,而不是 HTTP。

你应该使用 ecnodeURIComponent(url)
2021-03-11 02:37:26
如果我有这样的网址:var url = "http://kuler-api.adobe.com/rss/get.cfm?startIndex=0&itemsPerPage=20&timeSpan=0&listType=rating"...我想通过 Google Ajax API 访问它,就像这样:var gurl = "http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&q=" + url;...那么我必须使用escape(url). encodeURI(url)似乎不适用于这样的参数。
2021-03-13 02:37:26
所有 3 个函数都有其问题。最好创建自己的功能来完成这项工作。
2021-03-26 02:37:26