Подтвердить что ты не робот

Расшифровка параметров URL с помощью JavaScript

Это должно быть простой задачей, но я не могу найти решение.

У меня есть базовая строка, которая передается как параметр строки запроса, такой как этот: This+is+a+message+with+spaces. Я хотел бы декодировать этот параметр с помощью Javascript в This is a message with spaces, но я не могу его декодировать.

Я пробовал decodeURI('This+is+a+message+with+spaces'), но результат все еще содержит знаки +.

Любая помощь будет оценена по достоинству. Спасибо!

4b9b3361

Ответ 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"));
}