URLEncoder.encode () и пробел? - PullRequest
       2

URLEncoder.encode () и пробел?

2 голосов
/ 27 февраля 2011

На моем сервере есть ресурс с именем:

some image.png

В имени есть пробел. Когда я набираю URL в браузере (chrome), он преобразует пространство в% 20:

some%20.png

Когда я использую URLEncoder.encode ("some image.png") из своего приложения, я получаю:

some+image.png

, который вызывает 404. Как правильно кодировать?

Ответы [ 3 ]

4 голосов
/ 27 февраля 2011

IIRC, + и %20 являются допустимыми строками в URL.

В части пути URL + не зарезервировано [1], и поэтому не имеет специального значения ине должен быть% -кодирован.Следовательно, + буквально означает символ + в части пути URL.

В части запроса URL + зарезервировано [2], хотя цель не указана.

Однако при использовании HTML-форм MIME-кодировка application/x-www-form-urlencoded используется для кодирования параметров, которые (в запросе HTTP GET) включены в часть запроса URL-адреса [3].

Кодировка, используемая по умолчанию, основана на очень ранней версии общих правил кодирования процентов URI с рядом модификаций, таких как нормализация новой строки и замена пробелов на «+» вместо «%».20" .[3]

Источники:

http://www.ietf.org/rfc/rfc2396.txt

[1] Раздел 3.3

[2] Раздел 3.4

http://en.wikipedia.org/wiki/Percent-encoding

[3] «Заявка / x-www-form-urlencoded type»

4 голосов
/ 27 февраля 2011

http://www.permadi.com/tutorial/urlEncoding/

Обратите внимание, что, поскольку символ используется очень часто, специальный код (знак "+") был зарезервирован в качестве его кодировки URL.Таким образом, строка «AB» может быть URL-кодом, закодированным как «A% 20B» или «A + B»

Однако ваш код, вероятно, дает сбой, поскольку некоторые анализаторы / веб-серверы не обрабатывают их одинаководля частей базового URL - и распознавать только + = space в части строки запроса

0 голосов
/ 27 февраля 2011

Возможно, это не лучшее решение, но вы можете использовать path.replace ("", "% 20").

Как указывалось ранее, "+" и "% 20" должны работать, но если "+" нет, я думаю, вы должны заменить вручную.

...