2012-01-13 13 views
17

मैं विरासत कोड की इस पंक्ति है, जो मैं यह पता लगाने की कोशिश कर रहा हूँ भर में आ गए हैं:जावा स्ट्रिंग एन्कोडिंग (UTF-8)

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

जहां तक ​​मैं समझ सकता, इसे का उपयोग & डिकोडिंग एन्कोडिंग है एक ही charSet।

यह निम्नलिखित से अलग कैसे है?

String newString = oldString; 

वहाँ किसी भी परिदृश्य में जो दो लाइनें अलग आउटपुट होगा है?

पीएस .: बस स्पष्ट करने के लिए, हाँ मुझे excellent article on encoding by Joel Spolsky से अवगत है!

+8

निश्चित रूप से ठीक है, * एक * अंतर यह है कि' स्ट्रिंग newString = oldString साथ है यह दो चर से)। डीकोड/एन्कोड स्ट्रिंग के * प्रति * बनाता है। यह नहीं कि यह काफी मायने रखता है, क्योंकि 'स्ट्रिंग की अपरिवर्तनीय है। शायद यह नहीं है कि पुराना कोड उस तरह से है, यद्यपि; 'स्ट्रिंग' के पास क्लोन करने के लिए एक और अधिक सीधा तरीका है ('स्ट्रिंग (स्ट्रिंग)')। मैं 'स्ट्रिंग' कक्षा के एन्कोडिंग/डिकोडिंग विधियों का परीक्षण करने के अलावा, * अच्छा * कारण क्यों नहीं सोच सकता कि आप एन्कोडिंग/डिकोडिंग क्यों करेंगे। –

+0

क्या संदर्भ किसी भी संकेत देता है कि क्यों स्ट्रिंग रूपांतरण आवश्यक हो सकता है या आवश्यक था? –

+0

@ टीजेड्रोडर: +1, संभोग! मेरा मतलब वास्तविक वस्तु में अंतर का मतलब नहीं था। यह बात बताने के लिए धन्यवाद। – OceanBlue

उत्तर

22

यह

String newString = new String(oldString); 

करने का रास्ता जटिल हो सकता है यह छोटा कर स्ट्रिंग अंतर्निहित चार [] का इस्तेमाल किया बहुत लंबे समय तक है।

हालांकि अधिक विशेष रूप से यह जांच करेगा कि प्रत्येक चरित्र यूटीएफ -8 एन्कोडेड हो सकता है।

कुछ "वर्ण" कर रहे हैं आप एक स्ट्रिंग जो इनकोडिंग नहीं किया जा सकता है और इन \ uD800 और \ uDFFF के बीच ?

किसी भी चरित्र में बदल जाएगा इनकोडिंग नहीं किया जा सकता और में 'कर दिया जाएगा में हो सकती है?`, आप अभी भी केवल स्ट्रिंग की एक प्रतिलिपि है (आप बस की ओर इशारा करते रहे हैं, '

String oldString = "\uD800"; 
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"); 
System.out.println(newString.equals(oldString)); 

प्रिंट

false 
+0

बढ़िया के बराबर होगा संकलन नहीं है! धन्यवाद। – OceanBlue

+1

एकमात्र कारण 'पुराना स्ट्रिंग' ठीक से एन्कोड करने में विफल रहता है क्योंकि यह एक वैध यूटीएफ -16 (जावा में तारों का मूल प्रतिनिधित्व) स्ट्रिंग नहीं है। यूटीएफ -8 किसी भी और सभी यूनिकोड कोड बिंदुओं को एन्कोड करने में पूरी तरह से सक्षम है। इस मामले में, केवल तभी अंतर आएगा जब 'पुराने स्ट्रिंग' में यूटीएफ -16 बाइट्स का अमान्य अनुक्रम होता है। – Cagatay

4

यह निम्न से अलग कैसे है?

यहाँ कोड की यह पंक्ति:

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

एक नया स्ट्रिंग ऑब्जेक्ट निर्माण करती है (यानी एक oldString की प्रतिलिपि) है, जबकि कोड की इस पंक्ति:

String newString = oldString; 

का एक नया चर वाणी java.lang.String टाइप करें और इसे उसी स्ट्रिंग ऑब्जेक्ट को संदर्भित करने के लिए वैरिएबल oldString के रूप में प्रारंभ करें।

क्या कोई परिदृश्य है जिसमें दो पंक्तियों के अलग-अलग आउटपुट होंगे?

बिल्कुल:

String newString = oldString; 
boolean isSameInstance = newString == oldString; // isSameInstance == true 

बनाम

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 
// isSameInstance == false (in most cases)  
boolean isSameInstance = newString == oldString; 

a_horse_with_no_name (टिप्पणी देखें) सही का कोर्स है।

String newString = new String(oldString.getBytes("UTF-8"), "UTF-8")); 

के बराबर

String newString = new String(oldString); 

है शून्य से सूक्ष्म अंतर wrt एन्कोडिंग कि पीटर Lawrey उसके जवाब में बताते हैं।

+0

'स्ट्रिंग newString = नया स्ट्रिंग (oldString)' "मूल" लाइन मुझे लगता है कि –

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