I'm trying to encode URLs in Ruby and decode them with Javascript. However, the plus character is giving me weird behavior.
In Ruby:
[Dev]> CGI.escape "a b"
=> "a+b"
[Dev]> CGI.unescape "a+b"
=> "a b"
So far so good. But what about Javascript?
>>> encodeURI("a b")
"a%20b"
>>> decodeURI("a+b")
"a+b"
Basically I need a method of encoding / decoding URLs that works the same way in Javascript and Ruby.
Edit: decodeURIComponent
is no better:
>>> encodeURIComponent("a b")
"a%20b"
>>> decodeURIComponent("a+b")
"a+b"
I'm trying to encode URLs in Ruby and decode them with Javascript. However, the plus character is giving me weird behavior.
In Ruby:
[Dev]> CGI.escape "a b"
=> "a+b"
[Dev]> CGI.unescape "a+b"
=> "a b"
So far so good. But what about Javascript?
>>> encodeURI("a b")
"a%20b"
>>> decodeURI("a+b")
"a+b"
Basically I need a method of encoding / decoding URLs that works the same way in Javascript and Ruby.
Edit: decodeURIComponent
is no better:
>>> encodeURIComponent("a b")
"a%20b"
>>> decodeURIComponent("a+b")
"a+b"
Share
Improve this question
edited Dec 26, 2010 at 20:36
Tom Lehman
asked Dec 26, 2010 at 20:29
Tom LehmanTom Lehman
89.2k72 gold badges205 silver badges279 bronze badges
4 Answers
Reset to default 30+
is not considered a space. One workaround is to replace +
with %20
and then call decodeURIComponent
Taken from php.js' urldecode:
decodeURIComponent((str+'').replace(/\+/g, '%20'));
From MDC decodeURI:
Does not decode escape sequences that could not have been introduced by encodeURI.
From MDC encodeURI:
Note that encodeURI by itself cannot form proper HTTP GET and POST requests, such as for XMLHTTPRequests, because "&", "+", and "=" are not encoded
You might want to look at URI.encode
and URI.decode
:
require 'uri'
URI.encode('a + b') # => "a%20+%20b"
URI.decode('a%20+%20b') # => "a + b"
An alternate, that I use a lot, is Addressable::URI
:
require 'addressable/uri'
Addressable::URI.encode('a + b') #=> "a%20+%20b"
Addressable::URI.unencode('a%20+%20b') #=> "a + b"
You also get the same problem of a+b when sending a response from php via XMLHttpRequest if you use php urlencode. To solve it you have to use the php rawurlencode function.
From XMLHttpRequest to php urldecode works fine for some reason.