Java'da URL kod çözme nasıl yapılır?


323

Java, bunu dönüştürmek istiyorum:

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

Buna:

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

Şimdiye kadar sahip olduğum şey bu:

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){
        }
    }
}

Ama doğru çalışmıyor. Bunlara %3Ave %2Fbiçimlere ne denir ve bunları nasıl dönüştürebilirim?


@Stephen .. Bir url neden UTF-8 kodlu Dize olamaz?
kraker

Sorun, URL'nin UTF-8 olabilmesi nedeniyle sorunun UTF-8 ile gerçekten ilgisi olmamasıdır. Soruyu uygun şekilde düzenledim.
Chris Jester-Young

(Teoride) olabilir, ancak örneğinizdeki dize UTF-8 kodlu bir Dize değildir. URL kodlu bir ASCII dizesidir. Dolayısıyla başlık yanıltıcıdır.
Stephen C

urlDizedeki tüm karakterlerin ASCII olduğunu ve dizenin URL kodunu çözdükten sonra bu durumun da geçerli olduğunu belirtmek gerekir . '%'bir ASCII karakteridir ve (onaltılık) değerinden küçükse %xxbir ASCII karakteridir . xx80
Stephen C

Yanıtlar:


634

Bunun UTF-8 veya ASCII gibi karakter kodlamaları ile bir ilgisi yoktur. Orada sahip olduğunuz dize URL kodludur . Bu tür kodlama, karakter kodlamasından tamamen farklı bir şeydir.

Bunun gibi bir şey deneyin:

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 Charset, API için doğrudan destek ekledi , yani UnsupportedEncodingException'ı yakalamanıza gerek yok:

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

Bir karakter kodlamanın (UTF-8 veya ASCII gibi) karakterlerin ham baytlara eşlenmesini belirleyen şey olduğunu unutmayın. Karakter kodlamalarına iyi bir giriş için bu makaleye bakın .


1
Üzerindeki yöntemler URLDecoderstatiktir, bu nedenle yeni bir örnek oluşturmanız gerekmez.
laz

2
@Trismegistos Yalnızca karakter kodlamasını belirtmediğiniz sürüm (ikinci parametre "UTF-8"), Java 7 API belgelerine göre kullanımdan kaldırılmıştır. Sürümü iki parametreli kullanın.
Jesper

23
Java kullanılıyorsa 1.7+ siz "UTF-8" dizesi statik versiyonunu kullanabilirsiniz: StandardCharsets.UTF_8.name()Bu paketten: java.nio.charset.StandardCharsets. Bununla ilgili: link
Shahar

1
Karakter kodlaması için bu harika bir makale yapar balusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
crackerplace

4
Buna dikkat et. Burada belirtildiği gibi: blog.lunatech.com/2009/02/03/… Bu URL'lerle ilgili değil, HTML form kodlaması içindir.
Michal


47

Bu yanıtlandı önce (bu soru ilk olmasına rağmen!):

"URLDecoder sınıfı yanlış olan x-www-form-urlencoded kod çözme yaptığından java.net.URI kullanmalısınız (isme rağmen form verileri içindir)."

As URL sınıfı belgelerine devletler:

URL'lerin kodlamasını ve kodunu çözmenin önerilen yolu URI kullanmak ve toURI () ve URI.toURL () kullanarak bu iki sınıf arasında dönüştürme yapmaktır .

URLEncoder ve URLDecoder sınıfları da, ancak, sadece tanımlanan kodlama şeması aynı değildir HTML form kodlama için kullanılabilmektedir RFC2396 .

Temelde:

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

sana vereceğim:

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

6
Java 1.7'de URLDecoder.decode(String, String)aşırı yükleme onaylanmamıştır. URLDecoder.decode(String)Kodlama olmadan aşırı yüklenmeye başvurmalısınız . Açıklığa kavuşturmak için yayınınızı güncellemek isteyebilirsiniz.
Aaron

2
Bu cevap yanıltıcıdır; bu blok alıntısının kullanımdan kaldırılmasıyla hiçbir ilgisi yoktur. Kullanımdan kaldırılan yöntemin Javadocu belirtiyor ve aslında alıntı yapıyorum@deprecated The resulting string may vary depending on the platform's default encoding. Instead, use the decode(String,String) method to specify the encoding.
Emerson Farrugia

1
URI'ler için getPath (), yukarıda belirtildiği gibi URI'nin yalnızca yol kısmını döndürür.
Pelpotronic

2
Yanılmıyorsam, "yol", yetki bölümünden sonra bir URI'nin parçası olarak bilinir (yolun tanımı için en.wikipedia.org/wiki/Uniform_Resource_Identifier ) - bana gördüğüm davranış standart / doğru davranıştır. Java 1.8.0_101 (Android Studio'da) kullanıyorum. "GetAuthority ()" adı verildiğinde ne elde edeceğinizi merak ediyorum. Bu makale / örnek bile, yolun URI'lerinin
Pelpotronic

1
@ Yardımcı Program Postadaki kod aslında gösterdiği çıktıyı yazdırır (en azından benim için). Bunun nedeni, URL kodlaması nedeniyle URI yapıcısının aslında tüm dizeyi ( https%3A%2F...) bir URI'nin yolu olarak ele almasıdır; hiçbir yetki veya sorgu vb. yoktur. Bu, URI nesnesinde ilgili alma yöntemleri çağrılarak test edilebilir. Çözülmüş metni URI yapıcısına iletirseniz: new URI("https://mywebsite/do.....")çağrı getPath()ve diğer yöntemler doğru sonuçları verecektir.
Kröw


5
 try {
        String result = URLDecoder.decode(urlString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

5
public String decodeString(String URL)
    {

    String urlString="";
    try {
        urlString = URLDecoder.decode(URL,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block

        }

        return urlString;

    }

4
Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı biraz daha açıklayabilir misiniz?
abarisone


2
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")); 

    } 

}

Yönteminizi akıllıca seçebilirsiniz :)


0

Java.net.URI sınıfını kullanarak:

public String getDecodedURL(String encodedUrl) {
    try {
        URI uri = new URI(encodedUrl);
        return uri.getScheme() + ":" + uri.getSchemeSpecificPart();
    } catch (Exception e) {
        return "";
    }
}

İstisna işlemenin daha iyi olabileceğini, ancak bu örnek için fazla alakalı olmadığını lütfen unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.