2011-06-01 17 views
12

यूआरएल उदाहरण बनाने के लिए मैं गतिशील स्ट्रिंग मानों को कैसे एन्कोड कर सकता हूं? मुझे रिक्त स्थान को% 20, उच्चारण, गैर-ASCII वर्णों से प्रतिस्थापित करने की आवश्यकता है ...? मैंने URLEncoder का उपयोग करने की कोशिश की लेकिन यह '/' वर्ण को भी एन्कोड करता है और यदि मैं यूआरएलईएनकोडर के साथ यूआरएल कन्स्ट्रक्टर के साथ एन्कोडेड स्ट्रिंग देता हूं तो मुझे एक मालफॉर्मर्डलेक्सप्शन (कोई प्रोटोकॉल नहीं) मिलता है।जावा - यूआरएल

+4

का उपयोग कर कुछ उदाहरण स्ट्रिंग देने के लिए और आप कोड हैं, तो कृपया एक संदर्भ से यूआरएल का निर्माण। –

+0

विभिन्न एन्कोडिंग नियम अलग-अलग [यूआरआई के कुछ हिस्सों] पर लागू होंगे (http://illegalargumentexception.blogspot.com/2009/12/java-safe-character-handling-and-url.html#URI2009_ANATOMY)। चूंकि लुकास सुझाव देते हैं, कृपया उदाहरण के उदाहरण दें कि आप किस जानकारी से शुरुआत करते हैं और आप किसके साथ समाप्त करना चाहते हैं। – McDowell

उत्तर

3

तो आप जो कह रहे हैं वह है कि आप अपने यूआरएल का हिस्सा एन्कोड करना चाहते हैं लेकिन पूरी बात नहीं। मुझे लगता है जैसे आपको इसे भागों में तोड़ना होगा, उन लोगों को पास करना होगा जिन्हें आप एन्कोडर के माध्यम से एन्कोड करना चाहते हैं, और अपना पूरा यूआरएल प्राप्त करने के लिए इसे फिर से इकट्ठा करें।

32

URLEncoder में बहुत भ्रामक नाम है। यह Javadocs के अनुसार एमआईएमई प्रकार application/x-www-form-urlencoded का उपयोग कर एन्कोड फॉर्म पैरामीटर का उपयोग किया जाता है।

इस बात के साथ यह उदाहरण के लिए एन्कोड करने के लिए उपयोग किया जा सकता है, क्वेरी पैरामीटर। उदाहरण के लिए एक पैरामीटर के लग रहा है, तो जैसे &/?# अपने एन्कोडेड समकक्ष के रूप में इस्तेमाल किया जा सकता: जब तक आप उन विशेष जरूरतों URL javadocsnew URI(..).toURL जो RFC2396 के अनुसार URI एन्कोडिंग करता है का उपयोग कर पता चलता है है

String url = "http://host.com/?key=" + URLEncoder.encode("&/?#"); 

एन्कोडिंग और यूआरएल की डिकोडिंग का प्रबंधन करने के लिए अनुशंसित तरीका नमूना निम्न

new URI("http", "host.com", "/path/", "key=| ?/#ä", "fragment").toURL(); 

परिणाम http://host.com/path/?key=%7C%20?/%23ä#fragment पैदा करता यूआरआई

उपयोग करने के लिए है। ध्यान दें कि ?&/ जैसे वर्ण एन्कोडेड नहीं हैं।

अधिक जानकारी के लिए, पोस्ट HTTP URL Address Encoding in Java या how to encode URL to avoid special characters in java देखें।


संपादित

के बाद से अपने इनपुट एक स्ट्रिंग यूआरएल है, URI की पैरामिट्रीकृत निर्माता में से एक का उपयोग कर आप मदद नहीं करेगा। न तो आप new URI(strUrl) का उपयोग सीधे कर सकते हैं क्योंकि यह यूआरएल पैरामीटर उद्धृत नहीं करता है।

तो इस स्तर पर हम आप क्या चाहते हैं पाने के लिए एक चाल का उपयोग करना चाहिए:

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

इससे पहले कि आप यह एक पूर्ण यूआरएल का प्रतिनिधित्व करता है सुनिश्चित करने के लिए इस दिनचर्या आप sanitize अपने स्ट्रिंग के लिए है का उपयोग कर सकते हैं।

  1. अनुमान: मैं इस के लिए दो दृष्टिकोण से देखते हैं। http:// स्ट्रिंग पर तब तक तैयार करें जब तक यह पहले से मौजूद न हो।

  2. new URL(URL context, String spec)

+1

यूआरआई यूरी = नया यूआरआई ("www.google.com"); uri.toURL(); -> अपवाद: "यूआरआई पूर्ण नहीं है" – Arutha

+3

यह एक [वैध यूआरआई] नहीं है (http://www.ietf.org/rfc/rfc2396.txt)। कृपया सही * योजना *, उदाहरण के लिए, http का उपयोग करें। –

+0

मुझे उपयोगकर्ताओं से स्ट्रिंग प्राप्त होती है ... – Arutha

संबंधित मुद्दे