Как закодировать символ плюса (+) в URL-адресе

Приведенная ниже URL-ссылка откроет новое окно почты Google. У меня проблема в том, что Google заменяет все знаки плюса (+) в теле письма пустым пространством. Похоже, это происходит только со знаком +. Как я могу это исправить? (Я работаю над веб-страницей ASP.NET.)

https://mail.google.com/[email protected]&su=some subject & body = Привет + Привет!

(В основном письме Hi there + Hello there будет отображаться как Hi there Hello there)


person user523234    schedule 27.03.2011    source источник


Ответы (5)


Символ + в URL-адресе имеет особое значение = ›он означает пробел - . Если вы хотите использовать буквальный знак +, вам нужно закодировать URL-адрес в %2b:

body=Hi+there%2bHello+there

Вот пример правильного создания URL-адресов в .NET:

var uriBuilder = new UriBuilder("https://mail.google.com/mail");

var values = HttpUtility.ParseQueryString(string.Empty);
values["view"] = "cm";
values["tf"] = "0";
values["to"] = "[email protected]";
values["su"] = "some subject";
values["body"] = "Hi there+Hello there";

uriBuilder.Query = values.ToString();

Console.WriteLine(uriBuilder.ToString());

Результат

https://mail.google.com:443/mail?view=cm&tf=0&to=someemail%40somedomain.com&su=some+subject&body=Hi+there%2bHello+there

person Darin Dimitrov    schedule 27.03.2011
comment
В RFC четко сказано, что знак + можно использовать в незашифрованном виде, а также, если он должен быть закодирован, нет причин превращать его в пробел. Может быть, вы можете указать нам на соответствующий документ стандарта, в котором упоминается, что такое перевод символа + в символ пробела и наоборот. - person Pablo Ariel; 22.11.2013
comment
Да о чем ты говоришь? Я никогда не видел RFC или чего-нибудь, что говорит + означает пробелы .... - person freedrull; 14.12.2015
comment
Предупреждение. Если вы используете свойство Uri UriBuilder, вы получите плохой результат. uriBuilder.Uri.ToString() в вашем примере вернет Hi+there+Hello+there. Использование uriBuilder.Uri.AbsoluteUri, похоже, работает правильно, и stackoverflow.com/a/15120429/1931573 предполагает, что это исправлено в .NET 4.5. Что касается RFC, спецификация HTML 4 говорит, что строка запроса URL имеет тип application/x-www-form-urlencoded, который сам определяет (+) как означающее пространство. Так что это не RFC, а часть стандарта HTML. - person Nick; 15.06.2016
comment
@freedrull, но это действительно так - это показывает количество голосов за - person godblessstrawberry; 17.11.2016
comment
Обратите внимание, что IIS учитывает это двойное кодирование и часто блокирует URL-адрес, загруженный таким образом, с этой ошибкой: Ошибка HTTP 404.11 - не найдено. Модуль фильтрации запросов настроен на отклонение запроса, содержащего двойную escape-последовательность. - person Brady Moritz; 09.11.2018
comment
@freedrull Согласно . В документации .NET 5 для HTTPUtility.UrlEncode метод UrlEncode преобразует каждый пробел в знак плюса (+) (что подтверждается результатом в ответе). Согласно документации PHP для urldecode, символы плюса ('+' ) декодируются до символа пробела. - person Dave F; 28.05.2021
comment
@PabloAriel Согласно документу W3C с адресацией URL-адресов: в строке запроса , знак плюс зарезервирован как сокращенное обозначение пробела. Следовательно, действительные знаки плюса необходимо кодировать. Этот метод использовался, чтобы упростить передачу URI запросов в системах, в которых не допускались пробелы. - person Dave F; 28.05.2021

Если вам нужен символ плюса (+) в теле, вы должны закодировать его как 2B.

Например: Попробуйте это

person Black Frog    schedule 27.03.2011
comment
Буквально как %2B? - person Peter Mortensen; 03.01.2021

Чтобы закодировать значение + с помощью JavaScript, вы можете использовать функцию encodeURIComponent.

Example:

var url = "+11";
var encoded_url = encodeURIComponent(url);
console.log(encoded_url)

person morteza khadem    schedule 12.01.2019

Безопаснее всегда кодировать в процентах все символы, кроме тех, которые определены как "незарезервированные" в RFC-3986.

unreserved = АЛЬФА / ЦИФРА / "-" / "." / "_" / "~"

Итак, закодируйте в процентах знак плюса и другие специальные символы.

Проблема с плюсами заключается в том, что согласно RFC-1866 (спецификация HTML 2.0), параграф 8.2.1. подпункт 1., «Имена и значения полей формы экранируются: символы пробела заменяются на` + ', а затем зарезервированные символы экранируются »). Этот способ кодирования данных формы также указан в более поздних спецификациях HTML, ищите соответствующие параграфы о application / x-www-form-urlencoded.

person Maxim Masiutin    schedule 27.10.2016

Просто чтобы добавить это в список:

Uri.EscapeUriString("Hi there+Hello there") // Hi%20there+Hello%20there
Uri.EscapeDataString("Hi there+Hello there") // Hi%20there%2BHello%20there

См. https://stackoverflow.com/a/34189188/98491

Обычно вы хотите использовать EscapeDataString, который делает это правильно.

person Jürgen Steinblock    schedule 29.06.2020