开发者

Why doesn't decodeURI("a+b") == "a b"?

开发者 https://www.devze.com 2023-02-01 01:22 出处:网络
I\'m trying to encode URLs in Ruby and decode them with Javascript. However, the plus character is giving me weird behavior.

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: decodeURICompo开发者_StackOverflow中文版nent is no better:

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


+ 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.

0

精彩评论

暂无评论...
验证码 换一张
取 消