Por que decodeURI ("a + b") == "a b"?

Estou tentando codificar URLs em Ruby e decodificá-las com Javascript. No entanto, o personagem mais está me dando um comportamento estranho.

Em Ruby:

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

Por enquanto, tudo bem. Mas e o Javascript?

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

Basicamente, preciso de um método de codificação / decodificação de URLs que funcione da mesma maneira em Javascript e Ruby.

Editar: decodeURIComponent não é melhor:

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

questionAnswers(3)

yourAnswerToTheQuestion