编码要发送到Web服务器的查询字符串时 - 何时使用 escape()
以及何时使用 encodeURI()
或 encodeURIComponent()
:
使用转义:
escape("% +&=");
要么
使用encodeURI()/ encodeURIComponent()
encodeURI("http://www.google.com?var1=value1&var2=value2");
encodeURIComponent("var1=value1&var2=value2");
13 回答
encodeURI()
和encodeURIComponent()
之间的区别恰好是由encodeURIComponent编码的11个字符,而不是encodeURI编码的:我使用此代码在Google Chrome中使用 console.table 轻松生成此表格:
我有这个功能......
我发现这篇文章很有启发性:Javascript Madness: Query String Parsing
当我试图解释为什么decodeURIComponent没有正确解码时,我找到了它 . 这是一个摘录:
我发现即使在掌握了各种用途和功能之后,尝试各种方法也是一种很好的理智检查 .
为此,我发现this website非常有用,以证实我怀疑我正在做一些适当的事情 . 它也被证明可用于解码encodeURIComponent的字符串,这对于解释起来相当具有挑战性 . 一个很棒的书签:
http://www.the-art-of-web.com/javascript/escape/
escape()
不要用它!
escape()
在B.2.1.2 escape部分中定义,introduction text of Annex B表示:行为:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape
特殊字符的编码除外:@ * _ - ./
字符的十六进制形式,其代码单元值为0xFF或更小,是一个两位数的转义序列:
%xx
.对于具有更大代码单元的字符,使用四位数格式
%uxxxx
. 在查询字符串中(在RFC3986中定义)不允许这样做:仅当百分号直接后跟两个十六进制数字时才允许百分号,不允许使用百分号,然后是
u
.encodeURI()
如果需要工作URL,请使用encodeURI . 拨打这个电话:
要得到:
不要调用encodeURIComponent,因为它会破坏URL并返回
encodeURIComponent()
如果要对URL参数的值进行编码,请使用encodeURIComponent .
然后,您可以创建所需的URL:
您将获得这个完整的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
小对比表Java与JavaScript对比PHP .
我建议不要使用其中一种方法 . 写出你自己的功能,做正确的事 .
MDN给出了如下所示的url编码的一个很好的例子 .
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent
接受的答案是好的 . 扩展到最后一部分:
如果你想要安全起见,percent encoding unreserved characters也应该被编码 .
您可以使用此方法来转义它们(源Mozilla)
还要记住,它们都编码不同的字符集,并选择适当的字符集 . encodeURI()编码的字符数少于encodeURIComponent(),它比escape()编码的字符数更少(也与dannyp的点不同) .
@ johann-echavarria的现代改写答案:
或者,如果您可以使用表格,请将
console.log
替换为console.table
(用于更漂亮的输出) .出于编码的目的,javascript已经给出了三个内置函数 -
escape() - 不编码
@*/+
在ECMA 3之后不推荐使用此方法,因此应避免使用此方法 .encodeURI() - 不编码
~!@#$&*()=:/,;?+'
它假定URI是完整的URI,因此不编码URI中具有特殊含义的保留字符 . 当意图转换完整的URL而不是某些特殊的URL段时,使用此方法 . 示例 -encodeURI('http://stackoverflow.com');
将给出 - http://stackoverflow.comencodeURIComponent() - 不编码
- _ . ! ~ * ' ( )
此函数通过将某些字符的每个实例替换为表示一个,两个,三个或四个转义序列来编码统一资源标识符(URI)组件UTF-8编码的字符 . 此方法应用于转换URL的组件 . 例如,需要附加一些用户输入示例 -encodeURI('http://stackoverflow.com');
将给出 - http%3A%2F%2Fstackoverflow.com所有这些编码都以UTF 8格式执行,即字符将以UTF-8格式转换 .
encodeURIComponent differ from encodeURI in that it encode reserved characters and Number sign # of encodeURI
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:
对于解码URL:
encodeURI() - escape()函数用于javascript转义,而不是HTTP .