Comment encoder URL pour éviter les caractères spéciaux en Java? [dupliquer]

cette question a déjà une réponse ici:

  • adresse URL HTTP Encoding en Java 24 réponses

j'ai besoin de code java pour encoder URL pour éviter les caractères spéciaux tels que les espaces et % et & ...etc

32
demandé sur halfer 2010-12-31 20:12:34

6 réponses

construction D'URL est délicate parce que différentes parties de l'URL ont des règles différentes pour ce que les caractères sont autorisés: par exemple, le signe plus est réservé dans le composant requête D'une URL parce qu'il représente un espace, mais dans le composant chemin de l'URL, un signe plus n'a pas de signification particulière et les espaces sont encodés comme "%20".

RFC 2396 explique (dans la section 2.4.2) qu'une URL complète est toujours dans sa forme encodée: vous prenez le les chaînes pour les composants individuels (régime, de l'autorité, chemin, etc ... ), encodent chacun selon ses propres règles, puis les combinent dans la chaîne D'URL complète. Essayer de construire une chaîne D'URL complète non codée et de l'encoder séparément entraîne des bugs subtils, comme le fait que des espaces dans le chemin soient incorrectement modifiés en signes plus (qu'un serveur conforme à la RFC interprétera comme des signes plus réels, et non des espaces encodés).

en Java, la bonne façon de construire une URL est avec le URI de la classe. Utilisez l'un des constructeurs multi-arguments qui prend les composants D'URL comme des chaînes séparées, et il échappera chaque composant correctement selon les règles de ce composant. La méthode toASCIIString() vous donne une chaîne correctement échappée et encodée que vous pouvez envoyer à un serveur. À décoder une URL, construire un URI objet en utilisant le constructeur à chaîne simple et puis utiliser les méthodes accessor (tels que getPath() ) pour récupérer les composants décodés.

N'utilisez pas la classe URLEncoder ! Malgré le nom, cette classe fait en fait l'encodage de forme HTML, pas l'encodage D'URL. Il est et non correct de concaténer des chaînes non codées pour créer une URL" non codée "et la passer ensuite à travers un URLEncoder . Il en résultera des problèmes (en particulier le précédent concernant les espaces et les signaux plus dans le chemin).

64
répondu Wyzard 2010-12-31 17:50:13

ceci est une copie de la question ci-dessous. Vous pouvez trouver des informations plus détaillées et une discussion sur cette question à la question ci-dessous

adresse URL HTTP Encoding en Java

public class URLParamEncoder {

    public static String encode(String input) {
        StringBuilder resultStr = new StringBuilder();
        for (char ch : input.toCharArray()) {
            if (isUnsafe(ch)) {
                resultStr.append('%');
                resultStr.append(toHex(ch / 16));
                resultStr.append(toHex(ch % 16));
            } else {
                resultStr.append(ch);
            }
        }
        return resultStr.toString();
    }

    private static char toHex(int ch) {
        return (char) (ch < 10 ? '0' + ch : 'A' + ch - 10);
    }

    private static boolean isUnsafe(char ch) {
        if (ch > 128 || ch < 0)
            return true;
        return " %$&+,/:;=?@<>#%".indexOf(ch) >= 0;
    }

}
11
répondu fmucar 2017-05-23 10:31:30

si vous ne voulez pas le faire manuellement, utilisez la bibliothèque Apache Commons - Codec. La classe que vous regardez est: org.apache.commons.codec.net.URLCodec

String final url = "http://www.google.com?...."
String final urlSafe = org.apache.commons.codec.net.URLCodec.encode(url);
5
répondu langerra.com 2010-12-31 17:17:33

je ferais écho à ce que Wyzard a écrit mais ajouter que:

  • pour les paramètres de requête, l'encodage HTML est souvent exactement ce que le serveur attend; en dehors de ceux-ci, il est correct que URLEncoder ne doit pas être utilisé
  • la spécification URI la plus récente est RFC 3986 , donc vous devriez vous référer à cela comme une source primaire

de retour sur ce sujet: Java: sécurité de manipulation des caractères et l'URL du bâtiment

1
répondu McDowell 2017-05-23 12:10:11

j'ai aussi passé pas mal de temps avec cette question, donc c'est ma solution:

String urlString2Decode = "http://www.test.com/äüö/path with blanks/";
String decodedURL = URLDecoder.decode(urlString2Decode, "UTF-8");
URL url = new URL(decodedURL);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
String decodedURLAsString = uri.toASCIIString();
1
répondu TomTom 2018-01-17 23:08:36

voici ma solution qui est assez facile:

au lieu d'encoder l'url elle-même, J'ai encodé les paramètres que je passais parce que le paramètre était une entrée utilisateur et que l'utilisateur pouvait entrer n'importe quelle chaîne inattendue de caractères spéciaux, donc cela a fonctionné pour moi très bien:)

String review="User input"; /*USER INPUT AS STRING THAT WILL BE PASSED AS PARAMTER TO URL*/
try {
    review = URLEncoder.encode(review,"utf-8");
    review = review.replace(" " , "+");
} catch (UnsupportedEncodingException e) {
    e.printStackTrace();
}
String URL = "www.test.com/test.php"+"?user_review="+review;
-1
répondu Shahid Sarwar 2016-11-13 23:59:57