Глядя на веб-страницу кодирования URL-адресов W3 Schools, говорится, что @
должно быть закодировано как %40
, а space
должно быть кодируется как %20
.
Я пробовал как URLEncoder
, так и URI
, но ни один из них не работает должным образом:
import java.net.URI;
import java.net.URLEncoder;
public class Test {
public static void main(String[] args) throws Exception {
// Prints me%40home.com (CORRECT)
System.out.println(URLEncoder.encode("[email protected]", "UTF-8"));
// Prints Email+Address (WRONG: Should be Email%20Address)
System.out.println(URLEncoder.encode("Email Address", "UTF-8"));
// http://www.home.com/test?Email%[email protected]
// (WRONG: it has not encoded the @ in the email address)
URI uri = new URI("http", "www.home.com", "/test", "Email [email protected]", null);
System.out.println(uri.toString());
}
}
По какой-то причине URLEncoder
делает адрес электронной почты правильно, но не пробелы, а URI
делает пробелы валютой, но не адреса электронной почты.
Как я должен кодировать эти 2 параметра, чтобы они соответствовали тому, что w3schools считает правильным (или w3schools ошибается?)
URLEncoder
кодирует не в соответствии со спецификацией URL, а в соответствии с форматомapplication/x-www-form-urlencoded
MIME (это то, что большинство серверов приложений ожидает для ключей/значений параметров). ТипURI
кодирует в соответствии с его документацией, то есть это не полный Конструктор URL. Обратите внимание, что разные части URI имеют разные правила. См. эту публикацию. больше анализа. - person McDowell   schedule 14.01.2013