Я ожидаю
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8"));
вывести:
Hello%20World
(20 - шестнадцатеричный код ASCII для пробела)
Однако, что я получаю, это:
Hello+World
Я использую неправильный метод? Какой правильный метод я должен использовать?
Ответы:
Это ведет себя как ожидалось. В
URLEncoder
Реализует HTML спецификации о том , как кодировать URL - адреса в HTML - формах.Из Javadocs :
и из спецификации HTML :
Вам придется заменить его, например:
источник
t.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replace("\\+", "%20"));
Пробел кодируется
%20
в URL-адресах и+
в формах, в которые передаются данные (тип контента application / x-www-form-urlencoded). Вам нужен первый.Использование гуавы :
Вы можете использовать UrlEscapers :
Не используйте String.replace, это только кодирует пространство. Используйте библиотеку вместо.
источник
Этот класс выполняет
application/x-www-form-urlencoded
-тип , кодирующим , а не проценты кодирования, поэтому заменус
+
является правильным поведением.Из Javadoc:
источник
url
, пространство должно интерпретироваться как%20
. Так что нам нужно сделатьurl.replaceAll("\\+", "%20")
? И если это javascript, мы не должны использоватьescape
функцию. ИспользуйтеencodeURI
илиencodeURIComponent
вместо. Это то, о чем я думал.Кодировать параметры запроса
ИЛИ если вы хотите экранировать символы в URI
источник
org.apache.commons.httpclient.util.URIUtil
кажется, самый эффективный способ решить проблему!Hello+World
это то, как браузер будет кодировать данные формы (application/x-www-form-urlencoded
) дляGET
запроса, и это общепринятая форма для части запроса URI.Если вы отправите этот запрос сервлету Java, сервлет будет правильно декодировать значение параметра. Обычно здесь возникают проблемы только в том случае, если кодировка не совпадает.
Строго говоря, в спецификациях HTTP или URI не требуется кодировать часть запроса с использованием
application/x-www-form-urlencoded
пар ключ-значение; часть запроса просто должна быть в форме, которую принимает веб-сервер. На практике это вряд ли будет проблемой.Как правило, было бы неправильно использовать эту кодировку для других частей URI (например, путь). В этом случае вы должны использовать схему кодирования, как описано в RFC 3986 .
Больше здесь .
источник
Другие ответы представляют либо ручную замену строк, URLEncoder, который фактически кодирует для формата HTML, заброшенный URIUtil Apache , либо использование UrlEscapers в Guava . Последнее хорошо, за исключением того, что оно не обеспечивает декодер.
Apache Commons Lang предоставляет URLCodec , который кодирует и декодирует в соответствии с форматом URL rfc3986 .
Если вы уже используете Spring, вы также можете использовать его класс UriUtils .
источник
Только что боролся с этим и на Android, сумел наткнуться на Uri.encode (String, String), в то время как специфический для android (android.net.Uri) может быть полезен для некоторых.
статическое строковое кодирование (String s, String allow)
https://developer.android.com/reference/android/net/Uri.html#encode(java.lang.String, java.lang.String)
источник
«+» - это правильно. Если вам действительно нужен% 20, то замените Plusses потом.
источник
+
Символ в исходном тексте должен быть закодирован как%2B
.+
это правильно, не зная контекста, по крайней мере, педантично. Downvoted. Прочтите другие ответы, чтобы узнать, когда следует использовать + или% 20.Это сработало для меня
источник
Хотя довольно старый, тем не менее быстрый ответ:
Spring предоставляет UriUtils - с этим вы можете указать, как кодировать и с какой частью это связано с URI, например
Я использую их, потому что мы уже используем Spring, т.е. никакой дополнительной библиотеки не требуется!
источник
Проверьте класс java.net.URI.
источник
Да, этот метод java.net.URLEncoder.encode не был создан для преобразования "" в "20%" в соответствии со спецификацией ( источник ).
Даже если это не правильный метод, вы можете изменить это следующим образом:
System.out.println(java.net.URLEncoder.encode("Hello World", "UTF-8").replaceAll("\\+", "%20"));
хорошего дня =).источник
URLEncoder.encode
), и исправлять его, используя,replaceAll
который будет работать только в этом конкретном случае. Вместо этого используйте правильный класс и метод, смотрите другие ответы.ИСПОЛЬЗУЙТЕ MyUrlEncode.URLencoding (String url, String enc) для решения проблемы
источник
используйте набор символов "
ISO-8859-1
" для URLEncoderисточник