当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你什么时候应该使用escape而不是encodeURI/encodeURIComponent?》经验,为你挑选了9个好方法。

编码要发送到Web服务器的查询字符串时 - 何时使用escape()以及何时使用encodeURI()encodeURIComponent():

使用转义:

escape("% +&=");

要么

使用encodeURI()/ encodeURIComponent()

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

encodeURIComponent("var1=value1&var2=value2");

Arne Evertss.. 1891

逃逸()

不要用它! 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不允许使用百分号.

是encodeURI()

如果需要工作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
encodeURIComponent方法()

如果要对URL参数的值进行编码,请使用encodeURIComponent.

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

然后,您可以创建所需的URL:

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

您将获得这个完整的URL:

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

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

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



1> Arne Evertss..:
逃逸()

不要用它! 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不允许使用百分号.

是encodeURI()

如果需要工作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
encodeURIComponent方法()

如果要对URL参数的值进行编码,请使用encodeURIComponent.

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

然后,您可以创建所需的URL:

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

您将获得这个完整的URL:

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

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

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


@Francois,取决于接收服务器,它可能无法正确解码转义编码高位ASCII或非ASCII字符的方式,例如:ầẩẫấậêềểễếệ例如,如果编译了bye escape,Python的FieldStorage类将无法正确解码上述字符串.
@Francois escape()编码除字母,数字和*@-_+./之外的低128个ASCII字符,而unescape()是escape()的反转.据我所知,它们是为编码URL而设计的遗留功能,但仍然是为了向后兼容而实现的.通常,除非与为其设计的app/web服务/等交互,否则不应使用它们.
@Eric它不对单引号进行编码,因为单引号是在URI中发生的完全有效的字符([RFC-3986](http://tools.ietf.org/html/rfc3986#section-2.2)) .在HTML中嵌入URI时会出现问题,其中单引号*不是*有效字符.接下来,在放入HTML文档之前,URI也应该是"HTML编码的"(它将用'''替换`'`).
当然,除非您尝试将URL作为URI组件传递,否则调用encodeURIComponent.
为什么不处理单引号?
@DavidRR是我所指的案例之一.实际上,```在技术上并不是html文档正常内容中的任何有效字符(尽管在实践中,大多数浏览器只要不在属性值内就能很好地处理它).无论如何,为了在技术上正确,所有内容(包括URI)在被放置在html属性中的任何位置或html元素的文本内容之前应该进行html编码.(显然,某些特殊元素,如`
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有