जावा में डिकोडिंग कैसे करें?


323

जावा में, मैं इसे परिवर्तित करना चाहता हूं:

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

इसके लिए:

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

अभी तक मेरे पास इतना ही है:

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

लेकिन यह सही काम नहीं करता है। इन %3Aऔर %2Fस्वरूपों को क्या कहा जाता है और मैं उन्हें कैसे परिवर्तित करूं?


@Stephen .. क्यों एक url UTF-8 एन्कोडेड स्ट्रिंग नहीं हो सकता है ..?
पटाखा

समस्या यह है कि सिर्फ इसलिए कि URL UTF-8 हो सकता है, प्रश्न का वास्तव में UTF-8 से कोई लेना- देना नहीं है। मैंने प्रश्न को उपयुक्त तरीके से संपादित किया है।
क्रिस जस्टर-यंग

यह (सिद्धांत रूप में) हो सकता है लेकिन आपके उदाहरण में स्ट्रिंग UTF-8 एन्कोडेड स्ट्रिंग नहीं है। यह एक URL-एन्कोडेड ASCII स्ट्रिंग है। इसलिए शीर्षक भ्रामक है।
स्टीफन सी

यह भी ध्यान देने योग्य है कि urlस्ट्रिंग के सभी वर्ण ASCII हैं, और यह स्ट्रिंग के URL के डीकोड होने के बाद भी सही है। '%'एक ASCII वर्ण है और %xxयदि xx(हेक्साडेसिमल) से कम है तो ASCII चार का प्रतिनिधित्व करता है 80
स्टीफन सी

जवाबों:


634

इसका यूटीएफ -8 या एएससीआईआई जैसे चरित्र एन्कोडिंग से कोई लेना-देना नहीं है। आपके पास जो स्ट्रिंग है वह URL एनकोडेड है । इस तरह की एन्कोडिंग चरित्र एन्कोडिंग की तुलना में पूरी तरह से अलग है।

कुछ इस तरह की कोशिश करो:

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
}

जावा 10 ने Charsetएपीआई के लिए प्रत्यक्ष समर्थन जोड़ा , जिसका अर्थ है कि असमर्थित को पकड़ने की आवश्यकता नहीं है। अपवाद:

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

ध्यान दें कि एक वर्ण एन्कोडिंग (जैसे कि UTF-8 या ASCII) वह है जो कच्चे बाइट्स के लिए पात्रों की मैपिंग निर्धारित करता है। चरित्र एन्कोडिंग के लिए एक अच्छा परिचय के लिए, इस लेख को देखें


1
इस तरीके URLDecoderको स्थिर किया गया है ताकि आपको इसका एक नया उदाहरण न बनाना पड़े।
laz

2
@Trismegistos केवल संस्करण जहां आप वर्ण एन्कोडिंग (दूसरा पैरामीटर "UTF-8") निर्दिष्ट नहीं करते हैं, जावा 7 एपीआई प्रलेखन के अनुसार हटा दिया जाता है। दो मापदंडों के साथ संस्करण का उपयोग करें।
जेसपर

23
जावा का उपयोग कर 1.7+ आप "UTF-8" स्ट्रिंग के स्थिर संस्करण का उपयोग कर सकते हैं: StandardCharsets.UTF_8.name()इस पैकेज से: java.nio.charset.StandardCharsets। इसके लिए प्रासंगिक: लिंक
शाहर

1
चरित्र एन्कोडिंग के लिए, यह एक बेहतरीन लेख भी balusc.blogspot.in/2009/05/unicode-how-to-get-characters-right.html
crackerplace

4
इससे सावधान रहें। जैसा कि यहाँ उल्लेख किया गया है: blog.lunatech.com/2009/02/03/… यह URL के बारे में नहीं है, बल्कि HTML फ़ॉर्म एन्कोडिंग के लिए है।
मीकल

52

आपके द्वारा प्राप्त स्ट्रिंग application/x-www-form-urlencodedएन्कोडिंग में है।

जावा स्ट्रिंग में परिवर्तित करने के लिए URLDecoder का उपयोग करें ।

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

47

यह पहले उत्तर दिया गया है (हालांकि यह सवाल पहले था!):

"आपको ऐसा करने के लिए java.net.URI का उपयोग करना चाहिए, क्योंकि URLDecoder वर्ग x-www-form-urlencoded डिकोडिंग करता है जो गलत है (नाम के बावजूद, यह फॉर्म डेटा के लिए है)।"

के रूप में यूआरएल वर्ग प्रलेखन कहता है:

URL की एन्कोडिंग और डिकोडिंग का प्रबंधन करने के लिए अनुशंसित तरीका URI का उपयोग करना है , और इन दोनों वर्गों के बीच toURI () और URI.toURL () का उपयोग करना है

URLEncoder और URLDecoder कक्षाएं भी इस्तेमाल किया जा सकता है, लेकिन केवल HTML प्रपत्र एन्कोडिंग, जो एन्कोडिंग स्कीम में परिभाषित के रूप में ही नहीं है के लिए RFC2396

मूल रूप से:

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

तुम्हे दूंगा:

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

6
जावा 1.7 में URLDecoder.decode(String, String)अधिभार को पदावनत नहीं किया जाता है। आप URLDecoder.decode(String)एन्कोडिंग के बिना अधिभार का उल्लेख करना चाहिए । आप स्पष्टीकरण के लिए अपनी पोस्ट को अपडेट करना चाह सकते हैं।
हारून

2
यह उत्तर भ्रामक है; उस ब्लॉक उद्धरण का पदावनति से कोई लेना-देना नहीं है। पदावनत विधि का Javadoc बताता है, और मैं वास्तव में बोली@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 के लिए getPath () केवल URI का पथ भाग लौटाता है, जैसा कि ऊपर उल्लेख किया गया है।
पेलपोथ्रॉनिक

2
जब तक मैं गलत नहीं हूँ, "पथ" को प्राधिकरण भाग के बाद एक URI के उस भाग के रूप में जाना जाता है (देखें: en.wikipedia.org/wiki/Uniform_Resource_Identifier for path की परिभाषा) - ऐसा लगता है कि मैं जो व्यवहार देख रहा हूँ मानक / सही व्यवहार है। मैं java 1.8.0_101 (Android Studio पर) का उपयोग कर रहा हूँ। मुझे यह देखने के लिए उत्सुक होना चाहिए कि आपको "getAuthority ()" के रूप में क्या मिलता है। यहां तक ​​कि यह लेख / उदाहरण यह बताता है कि पथ उनके URI का केवल / सार्वजनिक / मैनुअल / उपकरणों का हिस्सा है: quepublishing.com/articles/article.aspx?p=26566&seqNum=3
पेलपॉनिक क्रॉनिक

1
@Pelpotronic पोस्ट में कोड वास्तव में आउटपुट दिखाता है जो इसे दिखाता है (कम से कम मेरे लिए)। मुझे लगता है कि इसका कारण यह है कि URL एन्कोडिंग के कारण, यूआरआई कंस्ट्रक्टर वास्तव में पूरे स्ट्रिंग का इलाज कर रहा है, ( https%3A%2F...), जैसे कि एक यूआरआई का मार्ग; कोई अधिकार या क्वेरी नहीं है, आदि यह URI ऑब्जेक्ट पर संबंधित प्राप्त तरीकों को कॉल करके परीक्षण किया जा सकता है। यदि आप यूआरआई कंस्ट्रक्टर को डिकोड किए गए पाठ को पास करते हैं: new URI("https://mywebsite/do.....")तो कॉलिंग getPath()और अन्य तरीके सही परिणाम देंगे।
क्रॉउन

14

%3Aऔर %2FURL एनकोडेड अक्षर हैं। उन्हें वापस :और में बदलने के लिए इस जावा कोड का उपयोग करें/

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

2
यह% 2C को भी परिवर्तित नहीं करता है, यह (
vuhung3990

इस की जरूरत है एक आज़माएं / कैच ब्लॉक में लिपटे होने के लिए .. जांचे हुए अपवादों (यह एक) बनाम अनियंत्रित बारे में अधिक पढ़ने stackoverflow.com/questions/6115896/...
ब्रूनो वोल्फ

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
क्या आप प्रदान किए गए समाधान के बारे में थोड़ा और विवरण जोड़कर अपने जवाब को विस्तृत कर सकते हैं?
अबरिसन


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

    } 

}

आप बुद्धिमानी से अपनी विधि का चयन कर सकते हैं :)


0

Java.net.URI वर्ग का उपयोग करना:

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

कृपया ध्यान दें कि अपवाद हैंडलिंग बेहतर हो सकती है, लेकिन यह इस उदाहरण के लिए अधिक प्रासंगिक नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.