Почему не 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, потому что "&", "+" и "=" не закодированы