352 votes

Comment faire du décodage d'URL en Java ?

En Java, je veux convertir ceci :

https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type

A ceci :

https://mywebsite/docs/english/site/mybook.do&request_type

Voici ce que j'ai jusqu'à présent :

class StringUTF 
{
    public static void main(String[] args) 
    {
        try{
            String url = 
               "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do" +
               "%3Frequest_type%3D%26type%3Dprivate";

            System.out.println(url+"Hello World!------->" +
                new String(url.getBytes("UTF-8"),"ASCII"));
        }
        catch(Exception E){
        }
    }
}

Mais ça ne fonctionne pas correctement. Que sont ces %3A et %2F et comment les convertir ?

0 votes

@Stephen Pourquoi une url ne peut-elle pas être une chaîne codée en UTF-8 ?

0 votes

Le problème est que, juste parce que l'URL peut être UTF-8, la question a réellement rien à faire avec UTF-8. J'ai modifié la question en conséquence.

0 votes

C'est possible (en théorie) mais la chaîne de votre exemple n'est pas une chaîne codée UTF-8. Il s'agit d'une chaîne ASCII codée par URL. Le titre est donc trompeur.

676voto

Jesper Points 65733

Cela n'a rien à voir avec les codages de caractères tels que UTF-8 ou ASCII. La chaîne que vous avez là est URL encodé . Ce type de codage est totalement différent du codage des caractères.

Essayez quelque chose comme ça :

try {
    String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8.name());
} catch (UnsupportedEncodingException e) {
    // not going to happen - value came from JDK's own StandardCharsets
}

Java 10 a ajouté un support direct pour Charset à l'API, ce qui signifie qu'il n'est pas nécessaire d'attraper UnsupportedEncodingException :

String result = java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);

Notez qu'un codage des caractères (comme UTF-8 ou ASCII) est ce qui détermine la correspondance des caractères aux octets bruts. Pour une bonne introduction aux codages de caractères, voir cet article .

1 votes

Les méthodes sur URLDecoder sont statiques, de sorte que vous n'avez pas à en créer une nouvelle instance.

0 votes

L'encodage d'URL @whataheck est utilisé parce qu'à certains endroits, il n'est pas possible d'utiliser tous les types de caractères dans une URL, de sorte que certains caractères sont échappés à l'aide d'une balise %xx comme l'explique Stephen C dans un commentaire sur votre question ci-dessus.

0 votes

La méthode que vous avez fournie est marquée comme obsolète. Pourquoi cela et quelle est l'alternative ?

54voto

Alexander Pogrebnyak Points 24964

La chaîne que vous avez est dans application/x-www-form-urlencoded l'encodage.

Utilisez URLDecoder pour le convertir en String Java.

URLDecoder.decode( url, "UTF-8" );

47voto

Nick G Points 1689

Il a été répondu à cette question avant (bien que cette question ait été la première !) :

"Vous devriez utiliser java.net.URI pour faire cela, car la classe URLDecoder fait un décodage x-www-form-urlencoded qui est faux (malgré le nom, c'est pour les données de formulaire)."

Comme URL La documentation de la classe indique :

La méthode recommandée pour gérer l'encodage et le décodage des URLs est d'utiliser utiliser URI et de convertir entre ces deux classes en utilisant toURI() et URI.toURL() .

Le site URLEncoder et URLDecoder peuvent également être utilisées, mais uniquement pour l'encodage du formulaire HTML, qui n'est pas le même que le schéma d'encodage défini dans RFC2396 .

En gros :

String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type";
System.out.println(new java.net.URI(url).getPath());

vous donnera :

https://mywebsite/docs/english/site/mybook.do?request_type

6 votes

En Java 1.7, l'option URLDecoder.decode(String, String) n'est pas dépréciée. Vous devez vous référer à la URLDecoder.decode(String) sans le codage. Vous pourriez vouloir mettre à jour votre message pour plus de clarté.

2 votes

Cette réponse est trompeuse ; ce bloc de citation n'a rien à voir avec la dépréciation. La Javadoc de la méthode dépréciée indique, et je cite effectivement @deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.

0 votes

@Klever, pas pour moi. Je crois que vous utilisez URL au lieu de URI mais vous n'avez pas fourni suffisamment d'informations pour reproduire vos résultats.

15voto

laz Points 12212

%3A et %2F sont des caractères codés en URL. Utilisez ce code java pour les reconvertir en : et /

String decoded = java.net.URLDecoder.decode(url, "UTF-8");

2 votes

Il ne convertit pas %2C aussi, c'est (,)

0 votes

Cela doit être enveloppé dans un bloc try/catch en savoir plus sur les exceptions vérifiées (celle-ci) et non vérifiées stackoverflow.com/questions/6115896/

3voto

Deepak Mishra Points 1996

J'utilise apache commons

String decodedUrl = new URLCodec().decode(url);

Le jeu de caractères par défaut est UTF-8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X