Android में URL एन्कोडिंग


336

आप एंड्रॉइड में URL कैसे एनकोड करते हैं ?

मैंने सोचा कि यह इस तरह था:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8");
URL url = new URL(encodedURL);

यदि मैं ऊपर करता हूं, तो http://इन urlAsStringको इसके द्वारा बदल दिया जाता http%3A%2F%2Fहै encodedURLऔर फिर मुझे java.net.MalformedURLExceptionURL का उपयोग करने पर मिलता है ।

जवाबों:


630

आप पूरे URL को एनकोड नहीं करते हैं, इसके कुछ हिस्से "अविश्वसनीय स्रोत" से आते हैं।

String query = URLEncoder.encode("apples oranges", "utf-8");
String url = "http://stackoverflow.com/search?q=" + query;

वैकल्पिक रूप से, आप उपयोग कर सकते Strings.urlEncode (स्ट्रिंग str) की DroidParts कि जांचे हुए अपवादों फेंक नहीं है।

या कुछ का उपयोग करें

String uri = Uri.parse("http://...")
                .buildUpon()
                .appendQueryParameter("key", "val")
                .build().toString();

1
अगर पूरा url अविश्वसनीय हो तो क्या होगा? क्या मुझे प्रोटोकॉल को छोड़कर सब कुछ सांकेतिक शब्दों में बदलना चाहिए? मैं ऐसा करने के लिए एक सुविधा विधि की अपेक्षा करता हूं।
hpique

5
तब यह सिर्फ एक टूटा हुआ यूआरएल है। विचार क्वेरी भाग को url को तोड़ने से रोकने के लिए है।
यानचेन

5
@hgpc - RFC3986 ( tools.ietf.org/html/rfc3986#section-3 ) के खंड 3 पर एक नज़र डालें । यह बताता है कि किसी URI के विभिन्न भागों को कैसे एनकोड करना है। दुर्भाग्य से URI (होस्ट, पाथ, क्वेरी, आदि) के प्रत्येक भाग में थोड़ा अलग एन्कोडिंग नियम हैं।
डी। शेवले जूल

2
यह ठीक है कि आप URL के किसी विशिष्ट भाग के साथ काम कर रहे हैं और आप जानते हैं कि URL का निर्माण या पुनर्निर्माण कैसे किया जाता है। अधिक सामान्य दृष्टिकोण के लिए जो किसी भी यूआरएल स्ट्रिंग को संभाल सकता है, नीचे मेरा जवाब देखें।
क्रेग बी

8
मुझे इसका उपयोग करके एक पदावनति चेतावनी क्यों मिल रही है? के Uri.encode(query);बजाय इस्तेमाल किया।
प्रशांत

166

मैं यहाँ एक सुझाव जोड़ने जा रहा हूँ। आप ऐसा कर सकते हैं जो किसी भी बाहरी पुस्तकालयों को प्राप्त करने से बचता है।

इसे आजमाइए:

String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4";
URL url = new URL(urlStr);
URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
url = uri.toURL();

आप देख सकते हैं कि इस विशेष URL में, मुझे उन स्थानों को इनकोडेड करने की आवश्यकता है ताकि मैं इसे अनुरोध के लिए उपयोग कर सकूं।

यह एंड्रॉइड कक्षाओं में आपके लिए उपलब्ध युगल सुविधाओं का लाभ उठाता है। सबसे पहले, URL वर्ग एक url को उसके उचित घटकों में तोड़ सकता है, इसलिए आपको कोई स्ट्रिंग खोज / प्रतिस्थापन कार्य करने की कोई आवश्यकता नहीं है। दूसरे, जब आप एक ही स्ट्रिंग के बजाय घटकों के माध्यम से एक यूआरआई का निर्माण करते हैं, तो यह दृष्टिकोण ठीक से बचने वाले घटकों के यूआरआई वर्ग सुविधा का लाभ उठाता है।

इस दृष्टिकोण की सुंदरता यह है कि आप किसी भी मान्य यूआरएल स्ट्रिंग को ले सकते हैं और इसे स्वयं के किसी विशेष ज्ञान की आवश्यकता के बिना काम कर सकते हैं।


19
यह सही उत्तर होना चाहिए। यह ऐसा करने का औपचारिक और स्पष्ट तरीका है
असंका सेनविरत्न

3
यूआरएल कंस्ट्रक्टर के पास भेजने से पहले urlStr को लोड करना भी एक अच्छा विचार हो सकता है। URLDecoder.decode (urlStr)
जैकब एरिकसन

1
पोस्ट के लिए धन्यवाद :) लेकिन मैं एक समस्या का सामना कर रहा हूं। यदि url पहले से ही आंशिक रूप से एन्कोडेड है, तो यह पहले से एन्कोड किए गए भागों को एन्कोड कर रहा है। मुझे क्या करना चाहिए? उदाहरण के लिए: dj-videos.us/Music/XclusiveSinGleTrack/320%20Kbps/... % 20% 2520 के लिए कोडित है
निडर

2
@ विंडसर यदि यह पहले से ही इनकोडेड है, तो इसे एनकोड न करें। आपको ऐसी स्थिति में नहीं जाना चाहिए जहां यह आंशिक रूप से एन्कोडेड है, या आप सुनिश्चित नहीं हैं कि यह एन्कोडेड है या नहीं।
लोर्न

3
यह विधि to% C4% 9F जैसे वर्णों को एनकोड नहीं करती है। एक सांकेतिक शब्दों में स्वीकार किया!
अलेक्जेंडर प्रोकोफयेव

74

Android के लिए, मैं String android.net.Uri.encode (स्ट्रिंग s) का उपयोग करूंगा

दिए गए स्ट्रिंग में '%' के रूप में वर्णों को एनकोड करता है - UTF-8 योजना का उपयोग करके ऑक्टेट से बच गया। अक्षर ("AZ", "az"), संख्याएं ("0-9"), और अनारक्षित वर्ण ("_-! ~ ~ () *") बरकरार हैं। अन्य सभी वर्णों को एनकोड करता है।

पूर्व /

String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query);

2
दुर्भाग्य से लेकिन अपेक्षित Uri.encode("a=1&b=1")उत्पादनa%3D1%26b%3D1a=1&b=1
loentar

14
@loentar यह अपेक्षित परिणाम है। यदि उपयोगकर्ता a=1&b=1क्वेरी के रूप में प्रवेश करता है, तो आप ठीक उसी तरह से क्वेरी करना चाहते हैं।
अबियान नोब

URLEncoder.encode (StringHere, "UTF-8") के साथ यह कितना अलग है
स्टिकओवरफ़्लो

एक बात के लिए @stuckedoverflow, Uri.encode (एसटीआर) URLEncoder.encode के विपरीत एक जाँच अपवाद फेंक नहीं है (str, "UTF-8")
deekshith

50

इसके अलावा आप इस का उपयोग कर सकते हैं

private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%";
String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS);

यह सबसे सरल विधि है


1
यह सबसे अच्छा समाधान नहीं है, लेकिन यह निश्चित रूप से एक अच्छा त्वरित समाधान है ... थैंक्स
सेबस्टियन ब्रेइट

4
यह संपूर्ण URL के अविश्वसनीय होने पर सबसे तेज़ फ़िक्स है। धन्यवाद!
user1032613

क्या आप सुनिश्चित हैं कि% को अनुमति दी जानी चाहिए? क्या इसका एनकाउंटर नहीं किया जाना चाहिए?
मीडियमऑन

1
इस url को साझा करने के लिए कैसे संभव किया जाए और फिर उपयोगकर्ता लिंक को खोलने और पेज को देखने में सक्षम हो: yazd20.com//News/2015/11/ استند-آب-كمدي-حمن-ريوندي-در-يزد html
अहमद इब्राहिमी 21

3
try {
                    query = URLEncoder.encode(query, "utf-8");
                } catch (UnsupportedEncodingException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

1

आप नीचे दिए गए तरीकों का उपयोग कर सकते हैं

public static String parseUrl(String surl) throws Exception
{
    URL u = new URL(surl);
    return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString();
}

या

public String parseURL(String url, Map<String, String> params)
{
    Builder builder = Uri.parse(url).buildUpon();
    for (String key : params.keySet())
    {
        builder.appendQueryParameter(key, params.get(key));
    }
    return builder.build().toString();
}

दूसरा वाला पहले से बेहतर है।


0

अरबी वर्ण खोजें और उन्हें इसके UTF-8 एन्कोडिंग से बदलें। कुछ इस तरह:

for (int i = 0; i < urlAsString.length(); i++) {
    if (urlAsString.charAt(i) > 255) {
        urlAsString = urlAsString.substring(0, i) + URLEncoder.encode(urlAsString.charAt(i)+"", "UTF-8") + urlAsString.substring(i+1);
    }
}
encodedURL = urlAsString;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.