Расшифровка параметров URL с помощью JavaScript
Это должно быть простой задачей, но я не могу найти решение.
У меня есть базовая строка, которая передается как параметр строки запроса, такой как этот: This+is+a+message+with+spaces
. Я хотел бы декодировать этот параметр с помощью Javascript в This is a message with spaces
, но я не могу его декодировать.
Я пробовал decodeURI('This+is+a+message+with+spaces')
, но результат все еще содержит знаки +
.
Любая помощь будет оценена по достоинству. Спасибо!
Ответы
Ответ 1
Знак плюса не кодируется/декодируется. Чтобы увидеть, как работает декодирующая функция, сначала необходимо передать кодированный URI. Посмотрите:
encodeURI( "http://www.foo.com/bar?foo=foo bar jar" )
Будет генерировать: http://www.foo.com/bar?foo=foo%20bar%20jar
, то есть закодированный URI.
decodeURI( "http://www.foo.com/bar?foo=foo%20bar%20jar" )
Будет генерировать: http://www.foo.com/bar?foo=foo bar jar
, то есть декодированный URI.
Ответ 2
Да, верно, что функция decodeURIComponent не преобразует + в пробел. Поэтому вам нужно заменить функцию замены +.
В идеале работает нижеследующее решение.
var str_name = 'This+is+a+message+with+spaces';
decodeURIComponent((str_name + '').replace(/\+/g, '%20'));
Ответ 3
Как уже указывалось, функция decodeURI
не конвертирует +
в пробел, , но есть некоторые вещи, которые стоит здесь реализовать:
-
decodeURI
предназначен для использования для полного URI, то есть он не декодирует разделители, такие как ?
, &
, =
, +
и т.д.
- для параметров декодирования
decodeURIComponent
следует использовать
(стоит взглянуть на: В чем разница между decodeURIComponent и decodeURI?)
Строка - которую вы пытаетесь декодировать, может содержать
+
, закодированную как %2B
, поэтому вы не должны заменять +
после преобразования, так как вы можете потерять знаки +
, которые вы действительно хотите там, например. something?num=%2B632+905+123+4567
должно стать:
something?num=+632 905 123 4567
так как вы, вероятно, собираетесь извлечь номер: +632 905 123 4567
Итак, правильный способ сделать это:
var str = 'something?num=%2B632+905+123+4567';
decodeURIComponent( str.replace(/\+/g, '%20') );
Ответ 4
Я создал свои собственные строковые методы для поддержки необходимой кодировки/декодирования. Эти методы будут корректно обрабатывать + кодирование и декодирование, позволяя вам иметь плюсы (+) в вашей строке и все еще иметь исходные пробелы, которые будут закодированы как +.
String.prototype.plusEncode = function() {
return encodeURIComponent(this).replace(/\%20/gm,"+");
}
String.prototype.plusDecode = function() {
return decodeURIComponent(this.replace(/\+/gm,"%20"));
}