Почему не decodeURI ("a + b") == "a b"? - PullRequest
21 голосов
/ 26 декабря 2010

Я пытаюсь кодировать 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"

Ответы [ 3 ]

28 голосов
/ 26 декабря 2010

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

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

decodeURIComponent((str+'').replace(/\+/g, '%20'));
3 голосов
/ 26 декабря 2010

Возможно, вы захотите взглянуть на 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 голосов
/ 26 декабря 2010

Из MDC decodeURI:

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

Из MDCencodeURI:

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

...