2013-07-30 6 views
8

मुझे यकीन नहीं है कि एसओएफ यह पूछने के लिए सबसे अच्छी जगह है, लेकिन जावा URLEncoder और URLDecoder के बारे में कुछ है।क्यों URLEncoder.encode (स्ट्रिंग, वर्णसेट), URLDecoder.decode (स्ट्रिंग, वर्णसेट)

URLEncoder के लिए, इसमें विधि encode(String, String) है जहां दूसरा पैरामीटर उपयोग करने के लिए एन्कोडिंग का नाम है। यदि एन्कोडिंग मान्य नहीं है, तो UnsupportedEncodingException फेंक दिया गया है। यह एक चेक अपवाद है, इसलिए encode() पर कॉल करते समय एक प्रयास-पकड़ विवरण का उपयोग किया जाना चाहिए। यह एक स्ट्रिंग एन्कोडिंग का उपयोग करने के मामले में समझ में आता है ...

लेकिन जावा Charset वर्ग में बनाया गया है और आप आसानी से Java's StandardCharsets या Guava's Charsets उपयोग करके अपने पसंदीदा एन्कोडिंग का Charset वस्तु पहुँच सकते हैं। यह अपवाद को पकड़ने की आवश्यकता को रोक देगा जो आपको पता चलेगा कि अगर आपने encode() सही ढंग से वर्तनी वाले एन्कोडिंग नाम को खिलाया है तो आपको कभी नहीं फेंक दिया जाएगा। URLEncoder.encode(String, Charset) की तरह एक विधि का उपयोग करने की क्षमता के बिना, कोड मैं लिखने वास्तव में बदसूरत हो जाता है क्योंकि मैं एन्कोडिंग नाम स्टोर करने के लिए एक अतिरिक्त स्ट्रिंग वैरिएबल स्टोर करने के लिए की जरूरत है और मैं बहुत की तरह एक बहुत निरर्थक कोशिश पकड़ बयान है,:

private static final String utf8 = "UTF-8"; 
... 
String msg = ...; 
try { 
    String encodedMsg = URLEncoder.encode(msg, utf8); 
    ... 
} catch (UnsupportedEncodingException e) { 
    // This exception should never happen 
    System.err.println("Uh oh..."); 
} 

उसी तर्क को URLDecoder.decode(String, String) पर लागू किया गया।

इसलिए, मैं बस सोच रहा हूं, जावा के पास URLEncoder.encode(String, Charset) और न ही URLDecoder.decode(String, Charset) क्यों है? जावा भाषा के डेवलपर्स के पास इसका समर्थन करने की कोई योजना है? यह ऊपर की बहु-पंक्ति monstrosity को एक और सुखद एक लाइनर में बदल देगा जो मुझे अपवाद को पकड़ने की आवश्यकता नहीं है, मुझे पता है कि जब तक सरकार ने यूटीएफ -8 को अपराध नहीं किया तब तक कभी नहीं होगा। क्या कोई मौजूदा कार्यान्वयन या पुस्तकालय है जो ULLEncoder और URLDecoder से इस अनुपलब्ध सुविधा में सुधार करता है? मैंने अमरूद में कुछ खोजने की कोशिश की, लेकिन कुछ भी नहीं मिला।

+3

मेरा अनुमान सिर्फ समय है - URLDecoder जेडीके 1.0 के साथ बाहर आया और चार्सेट बाद में जेडीके 1.4 के साथ आया। ['YourCharset.name()'] (http://docs.oracle.com/javase/7/docs/api/java/nio/charset/Charset.html#name%28%29) कैनोलिक नाम देता है, जो आप अपवाद के डर के बिना 'डीकोड()' तक पहुंचने में सक्षम होना चाहिए। – jedwards

+0

@jedwards आपको इसे एक जवाब देना चाहिए। – ecbrodie

+0

आपको 'अतिरिक्त स्ट्रिंग चर स्टोर करने की आवश्यकता नहीं है'। वह तुम्हारी पसंद थी। कंपाइलर ने सभी "यूटीएफ -8" को वैसे भी पूल किया होगा। भावी जावा विकास के बारे में प्रश्न भविष्य के जावा डेवलपर्स को संबोधित किए जाने चाहिए, एसओ नहीं। – EJP

उत्तर

5

मैं निश्चित रूप से नहीं कह सकता, लेकिन मेरा अनुमान बस समय है - URLDecoder जेडीके 1.0 के साथ बाहर आया और चार्सेट बाद में जेडीके 1.4 के साथ आया।

YourCharset.name() एक स्ट्रिंग को कैनोनिकल नाम वाला रिटर्न देता है, जिसे आप अपवाद के डर के बिना डीकोड() में पास करने में सक्षम होना चाहिए।

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