Почему не decodeURI ( "a + b" ) == "a b"?

Я пытаюсь закодировать URL-адреса в Ruby и декодировать их с помощью 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"

В принципе мне нужен метод кодирования/декодирования URL-адресов, который работает одинаково в Javascript и Ruby.

Изменить: decodeURIComponent не лучше:

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

Ответ 1

Возможно, вы захотите посмотреть URI.encode и URI.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

+ не считается пространством. Одним из способов является замена + на %20, а затем вызов decodeURIComponent

Взято из php.js 'urldecode:

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

Ответ 3

Из MDC decodeURI:

Не декодирует escape-последовательности, которые не могли быть введены encodeURI.

Из MDC encodeURI:

Обратите внимание, что encodeURI сам по себе не может формировать надлежащие запросы HTTP GET и POST, например, для XMLHTTPRequests, потому что "&", "+" и "=" не закодированы