2010-12-15 10 views
33

मैं वास्तव में जावा में तारों के एन्कोडिंग के बारे में उलझन में हूं। मेरे पास दो सवाल है। अगर आप उन्हें जवाब जानते हैं तो कृपया मेरी मदद करें:जावा में स्ट्रिंग का वर्ण एन्कोडिंग क्या है?

1) स्मृति में जावा स्ट्रिंग्स का मूल एन्कोडिंग क्या है? जब मैं String a = "Hello" लिखता हूं तो किस प्रारूप में इसे संग्रहीत किया जाएगा? चूंकि जावा मशीन स्वतंत्र है, इसलिए मुझे नहीं लगता कि सिस्टम एन्कोडिंग करेगा।

2) मैंने नेट पर पढ़ा है कि "यूटीएफ -16" डिफ़ॉल्ट एन्कोडिंग है लेकिन मुझे उलझन में आया क्योंकि जब मैं int a = 'c' लिखता हूं तो मुझे ASCII तालिका में वर्ण की संख्या मिलती है। तो एएससीआईआई और यूटीएफ -16 वही हैं?

3) इसके अलावा मुझे यकीन नहीं था कि स्मृति में एक स्ट्रिंग का भंडारण किस प्रकार निर्भर करता है: ओएस, भाषा?

+0

आपको इन्हें व्यक्तिगत प्रश्नों में तोड़ने पर विचार करना चाहिए, क्योंकि वे वास्तव में बहुत अलग हैं। # 2 का शायद यहां उत्तर दिया जा सकता है: http://stackoverflow.com/questions/1490218/utf-16-to-ascii-conversion-in-java –

उत्तर

15

1) स्ट्रिंग्स ऑब्जेक्ट्स हैं, जिनमें आमतौर पर char सरणी और स्ट्रिंग की लंबाई होती है। चरित्र सरणी को आमतौर पर 16-बिट शब्दों की एक संगत सरणी के रूप में कार्यान्वित किया जाता है, प्रत्येक में मूल बाइट ऑर्डर में यूनिकोड वर्ण होता है।

2) एक पूर्णांक में एक वर्ण मान असाइन करना 16-बिट यूनिकोड वर्ण कोड को इसके पूर्णांक समकक्ष में परिवर्तित करता है। इस प्रकार 'c', जो यू +0063 है, 0x0063, या 99 बन जाता है।

3) चूंकि प्रत्येक String एक वस्तु है, इसमें इसके वर्ग के सदस्यों की तुलना में अन्य जानकारी शामिल है (उदाहरण के लिए, क्लास डिस्क्रिप्टर शब्द, लॉक/सेमफोर शब्द इत्यादि)।

ADENDUM
वस्तु सामग्री JVM कार्यान्वयन (जो निहित प्रत्येक वस्तु के साथ जुड़े भूमि के ऊपर निर्धारित करता है) पर निर्भर करती है, और कैसे वर्ग वास्तव में कोडित है (यानी, कुछ पुस्तकालयों दूसरों की तुलना में अधिक कुशल हो सकता है)।

उदाहरण
एक ठेठ कार्यान्वयन वस्तु दृष्टान्त प्रति दो शब्दों से एक ओवरहेड आवंटित करेगा (कक्षा वर्णनकर्ता/सूचक के लिए, और एक सेमाफोर/लॉक नियंत्रण शब्द); String ऑब्जेक्ट में int लंबाई और char[] सरणी संदर्भ भी शामिल है। स्ट्रिंग की वास्तविक वर्ण सामग्री को दूसरी ऑब्जेक्ट में संग्रहीत किया जाता है, char[] सरणी, जो बदले में दो शब्दों को आवंटित किया जाता है, साथ ही एक सरणी लंबाई शब्द, साथ ही स्ट्रिंग के लिए आवश्यक 16-बिट char तत्वों के साथ-साथ कोई अतिरिक्त वर्ण स्ट्रिंग बनने के दौरान चारों ओर फांसी छोड़ दी गई थी)।

परिशिष्ट 2
मामले कि एक चार एक यूनिकोड वर्ण का प्रतिनिधित्व करता है अधिकांश मामलों में केवल सच है। यह 2005 से पहले UCS-2 एन्कोडिंग और सत्य का संकेत देगा। लेकिन अब तक यूनिकोड बड़ा हो गया है और स्ट्रिंग्स को यूटीएफ -16 का उपयोग करके एन्कोड किया जाना चाहिए - जहां एक एकल यूनिकोड चरित्र दोchar एस जावा String में उपयोग कर सकता है।

अपाचे के कार्यान्वयन के लिए वास्तविक स्रोत कोड पर एक नज़र डालें, उदा। पर:
http://www.docjar.com/html/api/java/lang/String.java.html

+0

वास्तव में आप अपने 3) भाग में क्या कहना चाहते हैं। इसमें अन्य जानकारी भी है .... ?? –

+0

"एक पूर्णांक में वर्ण मान को असाइन करना 16-बिट यूनिकोड वर्ण कोड को इसके पूर्णांक समकक्ष में परिवर्तित करता है।" यहां थोड़ा उलझन में यह है कि यूनिकोड एन्कोडिंग पहले 256 अक्षरों के लिए ASCII के साथ मेल खाता है। यूनिकोड पहले 256 अक्षरों के लिए विस्तारित ASCII (8-बिट) के साथ सहसंबंधित करता है; विस्तारित ASCII, बदले में, पहले 128 के लिए सीधे 7-बिट ASCII के साथ मेल खाता है। इसलिए 'सी' को यूनिकोड, विस्तारित ASCII और ASCII में 0x63 के रूप में एन्कोड किया गया है। यही कारण है कि आप 'सी' के लिए int देखेंगे और लगता है कि यह ASCII है (जो यह क्रमबद्ध है :)। –

+0

@ हाकीकीकर: हाँ, 7-बिट ASCII (आईएसओ 646) और 8-बिट आईएसओ 885 9 -1 (लैटिन -1) यूनिकोड के उचित सबसेट हैं। ऐसा कहा जा रहा है, जावा सभी वर्ण मानों को 16-बिट यूनिकोड के रूप में एन्कोड करता है। –

29
  1. जावा आंतरिक रूप से यूटीएफ -16 के रूप में तारों को स्टोर करता है।

  2. "डिफ़ॉल्ट एन्कोडिंग" बिल्कुल सही नहीं है। जावा आंतरिक रूप से यूटीएफ -16 के रूप में तारों को स्टोर करता है, लेकिन "सिस्टम डिफॉल्ट एन्कोडिंग" बाहरी रूप से उपयोग किया जाने वाला एन्कोडिंग प्लेटफ़ॉर्म से प्लेटफ़ॉर्म तक भिन्न होता है, और कुछ प्लेटफ़ॉर्म पर पर्यावरण चर जैसे चीजों से भी बदला जा सकता है।

    एएससीआईआई लैटिन 1 का उप-समूह है जो यूनिकोड का सबसेट है। यूटीएफ -16 यूनिकोड एन्कोडिंग का एक तरीका है। इसलिए यदि आप ASCII रेंज में आने वाले किसी भी चरित्र के लिए अपना int i = 'x' परीक्षण निष्पादित करते हैं तो आपको ASCII मान प्राप्त होगा। हालांकि, यूटीएफ -16 एएससीआईआई की तुलना में बहुत अधिक पात्रों का प्रतिनिधित्व कर सकता है।

  3. java.lang.Character docs से:

    जावा 2 मंच चार सरणियों में और स्ट्रिंग और StringBuffer कक्षाओं में UTF-16 के प्रतिनिधित्व का उपयोग करता है।

    तो इसे जावा 2 प्लेटफ़ॉर्म के हिस्से के रूप में परिभाषित किया गया है जो इन कक्षाओं के लिए यूटीएफ -16 का उपयोग किया जाता है।

+0

char और char arrays का उपयोग केवल सार्वजनिक, बाहरी API के लिए परिभाषित किया गया है स्ट्रिंग और स्ट्रिंगबफर के लिए। पात्रों का आंतरिक भंडारण कार्यान्वयन विशिष्ट है। – jarnbjo

+0

@jarnbjo उपर्युक्त दस्तावेज़ों से प्रत्यक्ष उद्धरण है। जावा में 'char' डेटाटाइप एक यूटीएफ -16 कोड इकाई (एक चरित्र, उर्फ ​​यूनिकोड कोडपॉइंट नहीं) का प्रतिनिधित्व करता है, इसलिए मुझे लगता है कि यह कहना सुरक्षित है कि जावा भाषा का पाठ का प्रतिनिधित्व यूटीएफ -16 है। हां, अनुमानतः एक कार्यान्वयन कवर के तहत कुछ अलग करने का विकल्प चुन सकता है, लेकिन अंत में उन्हें इसे यूटीएफ -16 का उपयोग करने की तरह दिखाना होगा। –

+0

चूंकि स्ट्रिंग और स्ट्रिंगबफर कक्षाओं के आंतरिक भंडारण तक पहुंचने का कोई तरीका नहीं है, इसलिए यह समझने में आता है कि आपके द्वारा उद्धृत बयान उस पर लागू होता है। – jarnbjo

2

हालांकि यह आपके प्रश्न का उत्तर नहीं है, यह देखते हुए कि ... जावा बाइट कोड (क्लास फाइल) में, स्ट्रिंग UTF-8 में संग्रहीत किया जाता है लायक है। http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

+1

ओपी ने मेमोरी स्टोरेज के बारे में पूछा,'class' फ़ाइल प्रारूप नहीं। –

+1

@ लोडमास्टर मैं विश्वास करता हूं कि यह एक उपयोगी जानकारी है, और मैंने उल्लेख किया है कि यह कक्षा फ़ाइल है - तो आपकी प्रोबेलम क्या है? – Ralph

+1

लेकिन यह सवाल का जवाब नहीं देता है। आप इसे एक टिप्पणी के रूप में पोस्ट कर सकते हैं और कुछ ऐसा शुरू कर सकते हैं जैसे "यह आपके प्रश्न का उत्तर नहीं देता है, यह ध्यान देने योग्य है कि ..." यह वास्तव में जानकारी का उपयोगी हिस्सा है, हालांकि, मुझे नहीं पता था कि उन्होंने यूटीएफ- 8। क्या बात है? इसका मतलब है कि जेवीएम को स्टार्टअप पर प्रत्येक स्ट्रिंग को यूटीएफ -16 में परिवर्तित करना होगा। –

1

संपादित करें: धन्यवाद मेरी मदद मेरा उत्तर :)

1) सभी आंतरिक स्ट्रिंग प्रसंस्करण UTF-16 में किया जाता है को सही करने के लिए LoadMaster करने के लिए।

2) एएससीआईआई यूटीएफ -16 का सबसेट है।

3) जावा में आंतरिक रूप से यूटीएफ -16 है। बाकी के लिए, यह इस बात पर निर्भर करता है कि आप कहां हैं, हां।

+2

स्ट्रिंग आंतरिक रूप से (स्मृति में) को 'char []' के रूप में संग्रहीत किया जाता है, प्रत्येक तत्व में 16-बिट यूटीएफ -16 यूनिकोड वर्ण होता है। यूटीएफ -8 का उपयोग आंतरिक रूप से तारों को स्टोर करने के लिए नहीं किया जाता है, लेकिन I/O धाराओं को तारों से/में परिवर्तित करने के लिए उपयोग किया जाता है। –

+0

@LoadMaster: क्या यह समय के दौरान बदल गया है? यूटीएफ -16 में जावा हमेशा आंतरिक रूप से था? – LaGrandMere

+0

हां, 'स्ट्रिंग' ने हमेशा अपने चरित्र मूल्यों को संग्रहीत करने के लिए आंतरिक' char [] 'का उपयोग किया है। –

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