Для меня это произошло потому, что я изменил тип аргумента в функции, от Object a, до String a. Я мог бы решить это с чистой и построить снова
URLEncoder
должен быть способом. Вам нужно только иметь в виду только кодировать только имя и / или значение имени строки запроса, а не весь URL-адрес, а не символ разделителя параметров строки запроса &
или имя параметра- символ разделителя значений =
.
String q = "random word £500 bank $";
String url = "http://example.com/query?q=" + URLEncoder.encode(q, "UTF-8");
Обратите внимание, что пробелы в параметрах запроса представлены +
, а не %20
, что является законно действительным. %20
обычно используется для представления пробелов в самом URI (часть перед символом разделителя строки URI-запроса ?
), а не в строке запроса (часть после ?
).
Также обратите внимание, что существует два метода encode()
. Один без аргумента набора символов и другой. Тот, у кого аргумент без аргумента, устарел. Никогда не используйте его и всегда указывайте аргумент charset. javadoc даже явно рекомендует использовать кодировку UTF-8, как это предусмотрено RFC3986 и W3C .
Все остальные символы небезопасны и сначала преобразуются в один или несколько байтов, используя некоторую схему кодирования. Затем каждый байт представлен 3-символьной строкой «% xy», где xy - двухзначное шестнадцатеричное представление байта. Рекомендуемой схемой кодирования для использования является UTF-8. Однако, по соображениям совместимости, если кодировка не указана, используется кодировка по умолчанию платформы.
См. Также:
Я бы не использовал URLEncoder
. Помимо неправильного имени (URLEncoder
не имеет ничего общего с URL-адресами), неэффективен (вместо Builder он использует StringBuffer
и делает несколько других вещей, которые медленны). Также слишком легко его испортить.
Вместо этого я использовал бы URIBuilder
или Spring org.springframework.web.util.UriUtils.encodeQuery
или Commons Apache HttpClient
. Причина заключается в том, что вам нужно избегать имени параметров запроса (то есть ответ BalusC q
) иначе, чем значение параметра.
Единственный недостаток вышеизложенного (что я обнаружил болезненно) заключается в том, что URL не является истинным подмножеством URI .
Пример кода:
import org.apache.http.client.utils.URIBuilder;
URIBuilder ub = new URIBuilder("http://example.com/query");
ub.addParameter("q", "random word £500 bank \$");
String url = ub.toString();
// Result: http://example.com/query?q=random+word+%C2%A3500+bank+%24
Поскольку я просто ссылаюсь на другие ответы, я отметил это как вики сообщества. Не стесняйтесь редактировать.
URLEncoder
, так как его javadoc говорит, что он намерен кодировать параметры строки запроса application/x-www-form-urlencoded
, как описано в спецификации HTML: w3.org/TR/html4/interact/… . Некоторые пользователи действительно путают / злоупотребляют им для кодирования всех URI, как, по-видимому, нынешний ответчик.
– BalusC
3 February 2015 в 19:15
Я бы использовал этот код:
Uri myUI = Uri.parse ("http://example.com/query").buildUpon().appendQueryParameter("q","random word A3500 bank 24").build();
Теперь Guava 15 добавила набор простых URL-адресов escapers .
URLEncoder
нет.
– Emmanuel Touzery
16 April 2015 в 11:01
java.net.URL
.
2. Кодируйте каждую структурную часть правильно!
3. Использовать IDN.toASCII(putDomainNameHere)
- Punycode кодировать имя хоста!
4. Используйте java.net.URI.toASCIIString()
для процентного кодирования, кодированного в кодировке NFC unicode - (лучше было бы NFKC!). Для получения дополнительной информации см.: Как правильно закодировать этот URL
URL url= new URL("http://example.com/query?q=random word £500 bank $");
URI uri = new URI(url.getProtocol(), url.getUserInfo(), IDN.toASCII(url.getHost()), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String correctEncodedURL=uri.toASCIIString();
System.out.println(correctEncodedURL);
Печать
http://example.com/query?q=random%20word%20%C2%A3500%20bank%20$
Вам нужно сначала создать URI, например:
String urlStr = "http://www.example.com/CEREC® Materials & Accessories/IPS Empress® CAD.pdf"
URL url= new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
Затем преобразовать эту строку Uri в ASCII:
urlStr=uri.toASCIIString();
Теперь ваша строка url полностью закодирована, простое кодирование url, а затем мы преобразовали его в ASCII String, чтобы убедиться, что в строке нет символа вне US-ASCII. Это как раз то, как делают браузеры.
URL.toURI()
не работает.
– user11153
25 March 2015 в 13:45
Вот способ, который вы можете использовать в своем коде для преобразования строки url и карты параметров в действительную кодированную строку url, содержащую параметры запроса.
String addQueryStringToUrlString(String url, final Map<Object, Object> parameters) throws UnsupportedEncodingException {
if (parameters == null) {
return url;
}
for (Map.Entry<Object, Object> parameter : parameters.entrySet()) {
final String encodedKey = URLEncoder.encode(parameter.getKey().toString(), "UTF-8");
final String encodedValue = URLEncoder.encode(parameter.getValue().toString(), "UTF-8");
if (!url.contains("?")) {
url += "?" + encodedKey + "=" + encodedValue;
} else {
url += "&" + encodedKey + "=" + encodedValue;
}
}
return url;
}
Библиотека Apache Http Components предоставляет опрятную опцию для создания и кодирования параметров запроса -
с использованием HttpComponents 4.x - URLEncodedUtils
Для HttpClient 3 .x use - EncodingUtil
String encodedUrl1 = UriUtils.encodeQuery(query, "UTF-8");//not change
String encodedUrl2 = URLEncoder.encode(query, "UTF-8");//changed
String encodedUrl3 = URLEncoder.encode(query, StandardCharsets.UTF_8.displayName());//changed
System.out.println("url1 " + encodedUrl1 + "\n" + "url2=" + encodedUrl2 + "\n" + "url3=" + encodedUrl3);
=
и &
, что неверно.
– user207421
13 February 2018 в 02:40
URLEncoder
для URL-кодированных параметров запроса соответствует правиламapplication/x-www-form-urlencoded
. Параметры пути не соответствуют этой категории. Вместо этого вам нужен кодер URI. – BalusC 30 July 2017 в 13:18StandardCharsets.UTF_8.name()
– Jose Duarte 28 February 2018 в 18:48