为什么不decodeURI(“a + b”)==“a b”?

时间:2010-12-26 20:29:44

标签: javascript ruby urlencode decode encode

我正在尝试在Ruby中编码URL并使用Javascript对其进行解码。但是,正字符给我带来了奇怪的行为。

在Ruby中:

[Dev]> CGI.escape "a b"
=> "a+b"
[Dev]> CGI.unescape "a+b"
=> "a b"

到目前为止一切顺利。但是Javascript呢?

>>> encodeURI("a b")
"a%20b"
>>> decodeURI("a+b")
"a+b"

基本上我需要一种在Javascript和Ruby中以相同方式编码/解码URL的方法。

编辑: decodeURIComponent并不是更好:

>>> encodeURIComponent("a b")
"a%20b"
>>> decodeURIComponent("a+b")
"a+b"

4 个答案:

答案 0 :(得分:28)

+不被视为空格。一种解决方法是将+替换为%20,然后调用decodeURIComponent

取自php.js'urldecode

decodeURIComponent((str+'').replace(/\+/g, '%20'));

答案 1 :(得分:3)

您可能需要查看URI.encodeURI.decode

require 'uri'

URI.encode('a + b') # => "a%20+%20b"
URI.decode('a%20+%20b') # => "a + b"

我经常使用的替代品是Addressable::URI

require 'addressable/uri'
Addressable::URI.encode('a + b') #=> "a%20+%20b"
Addressable::URI.unencode('a%20+%20b') #=> "a + b"

答案 2 :(得分:2)

From MDC decodeURI:

  

不解码encodeURI无法引入的转义序列。

From MDC encodeURI:

  

请注意,encodeURI本身无法形成正确的HTTP GET和POST请求,例如XMLHTTPRequests,因为“&”,“+”和“=”未编码

答案 3 :(得分:-1)

如果使用php urlencode,则通过XMLHttpRequest从php发送响应时,也会遇到a + b的相同问题。要解决此问题,您必须使用php rawurlencode函数。

出于某种原因,从XMLHttpRequest到php urldecode可以正常工作。