¿Por qué no decodeURI (“a + b”) == “a b”?

Estoy tratando de codificar URL en Ruby y decodificarlas con Javascript. Sin embargo, el carácter positivo me está dando un comportamiento extraño.

En rubí:

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

Hasta aquí todo bien. ¿Pero qué hay de Javascript?

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

Básicamente, necesito un método de codificación / decodificación de URL que funcione de la misma manera en Javascript y Ruby.

Editar: decodeURIComponent no es mejor:

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

Respuestas a la pregunta(3)

Su respuesta a la pregunta