Когда кодировать пробел в плюс (+) или% 20? - PullRequest
428 голосов
/ 21 апреля 2010

Иногда пробелам присваивается URL, закодированный в знак +, иногда в %20. В чем разница и почему это должно происходить?

Ответы [ 5 ]

433 голосов
/ 21 апреля 2010

+ означает пробел только в application/x-www-form-urlencoded контенте, например в части запроса URL:

http://www.example.com/path/foo+bar/path?query+name=query+value

В этом URL имя параметра query name с пробелом, а значение query value с пробелом, но имя папки в пути буквально foo+bar, , а не foo bar.

%20 является допустимым способом кодирования пробела в любом из этих контекстов. Поэтому, если вам нужно кодировать строку URL для включения в часть URL, всегда безопасно заменить пробелы на %20 и плюсы на %2B. Вот что например. encodeURIComponent() делает в JavaScript. К сожалению, это не то, что urlencode делает в PHP ( rawurlencode безопаснее).

Смотрите также HTML 4.01 Спецификация приложения / x-www-form-urlencoded

47 голосов
/ 14 ноября 2011

http://www.example.com/some/path/to/resource?param1=value1

Часть перед знаком вопроса должна использовать% encoding (поэтому %20 для пробела), после знака вопроса вы можете использовать либо %20, либо + для пробела. Если вам нужен фактический + после знака вопроса, используйте %2B.

27 голосов
/ 08 ноября 2017

Итак, ответы здесь немного неполные. Использование «% 20» для кодирования пробела в URL-адресах явно определено в RFC3986 , который определяет, как создается URI. В этой спецификации нет упоминания об использовании «+» для кодирования пробелов - если вы используете только эту спецификацию, пробел должен быть закодирован как «% 20».

Упоминание об использовании «+» для кодирования пробелов происходит из различных воплощений спецификации HTML - в частности, в разделе, описывающем тип контента «application / x-www-form-urlencoded». Используется для публикации данных формы.

Теперь спецификация HTML 2.0 (RFC1866) прямо указала в разделе 8.2.2, что часть запроса строки URL-адреса GET-запроса должна быть закодирована как 'application / x-www-form- urlencoded. Теоретически это предполагает, что в URL-адресе в строке запроса разрешается использовать «+» (после «?»).

Но ... это правда? Помните, что HTML сам по себе является спецификацией контента, и URL-адреса со строками запроса можно использовать с контентом, отличным от HTML. Кроме того, хотя более поздние версии спецификации HTML продолжают определять «+» как допустимый в контенте «application / x-www-form-urlencoded», они полностью пропускают часть, в которой говорится, что строки запроса GET определены как этот тип. На самом деле, нет никаких упоминаний о кодировании строки запроса ни в чем после спецификации HTML 2.0.

Что оставляет нас с вопросом - это действительно? Конечно, есть много устаревшего кода, который поддерживает '+' в строках запроса, и много кода, который также генерирует его. Так что шансы хороши, что вы не сломаете, если будете использовать «+». (И, фактически, я недавно провел все исследования по этому вопросу, потому что обнаружил основной сайт, который не смог принять «% 20» в запросе GET в качестве пробела. Им фактически не удалось декодировать ЛЮБОЙ процентный кодированный символ. Используете может быть актуально.)

Но из чистого прочтения спецификаций, без языка из спецификации HTML 2.0, перенесенного в более поздние версии, URL полностью покрываются RFC3986, что означает, что пробелы должны быть преобразованы в «% 20». И, безусловно, так должно быть, если вы запрашиваете что-либо, кроме HTML-документа.

7 голосов
/ 27 октября 2016

Лучше всегда кодировать пробелы как% 20, а не как "+".

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

Вот пример такой строки в URL, где RFC-1866 допускает кодирование пробелов в виде плюсов: «http://example.com/over/there?name=foo+bar". Таким образом, только после«? »Пробелы могут быть заменены на плюсы, в соответствии с RFC-1866. В других в некоторых случаях пробелы должны быть закодированы в% 20. Но так как контекст трудно определить, лучше никогда не кодировать пробелы как "+".

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

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
2 голосов
/ 14 октября 2016

В чем разница: см. Другие ответы.

Когда используется + вместо %20? Используйте +, если по какой-то причине вы хотите сделать строку запроса URL (?.....) или хеш-фрагмент (#....) более читабельной. Пример: Вы действительно можете прочитать это:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces (%2B = +)

Но следующее гораздо труднее читать: (по крайней мере, мне)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

Я думаю, что + вряд ли что-то сломает, поскольку Google использует + (см. 1-ю ссылку выше), и они, вероятно, подумали об этом. Я собираюсь использовать + сам только потому, что читабельно + Google считает, что все в порядке.

...