En Java, je veux convertir ceci:
https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type
Pour ça:
https://mywebsite/docs/english/site/mybook.do&request_type
C'est 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 marche pas bien. Comment appelle-t-on ces formats %3A
et %2F
et comment les convertir?
Cela n’a rien à voir avec des codages de caractères tels que UTF-8 ou ASCII. La chaîne que vous avez là est URL encodée. Ce type de codage est tout à fait différent du codage de 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 de capturer UnsupportedEncodingException:
String result = Java.net.URLDecoder.decode(url, StandardCharsets.UTF_8);
Notez qu'un codage character (tel que UTF-8 ou ASCII) est ce qui détermine le mappage des caractères sur des octets bruts. Pour une bonne introduction aux encodages de caractères, voir cet article .
La chaîne que vous avez est au format application/x-www-form-urlencoded
.
Utilisez URLDecoder pour le convertir en chaîne Java.
URLDecoder.decode( url, "UTF-8" );
Ceci a été répondu avant (bien que cette question fût la première!):
"Vous devez utiliser Java.net.URI pour cela, car la classe URLDecoder effectue un décodage x-www-form-urlencoded qui est incorrect (malgré le nom, c'est pour les données de formulaire)."
Fondamentalement:
String url = "https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type";
System.out.println(new Java.net.URI(url).getPath());
te donnera:
https://mywebsite/docs/english/site/mybook.do?request_type
%3A
et %2F
sont des caractères encodés en URL. Utilisez ce code Java pour les reconvertir en :
et /
String decoded = Java.net.URLDecoder.decode(url, "UTF-8");
try {
String result = URLDecoder.decode(urlString, "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
J'utilise Apache commons
String decodedUrl = new URLCodec().decode(url);
Le jeu de caractères par défaut est UTF-8
public String decodeString(String URL)
{
String urlString="";
try {
urlString = URLDecoder.decode(URL,"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
}
return urlString;
}
import Java.io.UnsupportedEncodingException;
import Java.net.URISyntaxException;
public class URLDecoding {
String decoded = "";
public String decodeMethod(String url) throws UnsupportedEncodingException
{
decoded = Java.net.URLDecoder.decode(url, "UTF-8");
return decoded;
//"You should use Java.net.URI to do this, as the URLDecoder class does x-www-form-urlencoded decoding which is wrong (despite the name, it's for form data)."
}
public String getPathMethod(String url) throws URISyntaxException
{
decoded = new Java.net.URI(url).getPath();
return decoded;
}
public static void main(String[] args) throws UnsupportedEncodingException, URISyntaxException
{
System.out.println(" Here is your Decoded url with decode method : "+ new URLDecoding().decodeMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest_type"));
System.out.println("Here is your Decoded url with getPath method : "+ new URLDecoding().getPathMethod("https%3A%2F%2Fmywebsite%2Fdocs%2Fenglish%2Fsite%2Fmybook.do%3Frequest"));
}
}
Vous pouvez choisir votre méthode judicieusement :)
URLDecoder.decode
une fois ne suffira pas.Par exemple :
Étant donné que la même URL peut être codée plusieurs fois, nous devons la décoder jusqu'à ce que l'URL ne puisse plus être décodée. Par exemple, "video% 252Fmp4" est le résultat de deux encodages. Après le décodage une fois, nous obtenons "video% 2Fmp4". Maintenant, l'URL doit être décodé davantage pour que nous obtenions "video/mp4", qui est le résultat.
public static String decode(String url)
{
try {
String prevURL="";
String decodeURL=url;
while(!prevURL.equals(decodeURL))
{
prevURL=decodeURL;
decodeURL=URLDecoder.decode( decodeURL, "UTF-8" );
}
return decodeURL;
} catch (UnsupportedEncodingException e) {
return "Issue while decoding" +e.getMessage();
}
}