दिलचस्प पोस्ट
फ़ायरफ़ॉक्स या क्रोम में ActiveXObject (IE नहीं!) आवेदन को बढ़ाया यूएसी दे रहा है HTTP प्रतिसादों को कैशिंग करना जब वे गतिशील रूप से PHP द्वारा बनाए जाते हैं MPMediaItems कच्चे गीत डेटा क्या जावास्क्रिप्ट में "वापसी! 0" का उपयोग करने का कोई मतलब है? क्यों इस कोड में कोई भी रिटर्न शामिल नहीं है? यूनिकोडएएनकोड त्रुटि: 'charmap' कोडेक अक्षरों को एन्कोड नहीं कर सकता jQuery को एक ऑब्जेक्ट के साथ पंजीकृत ईवेंट हैंडलर्स मिलते हैं SQL सर्वर 2005 में कॉमा से अलग NVARCHAR को टेबल रिकॉर्ड्स में कैसे रूपांतरित करना है? आईफ़ोन: कुंजीपटल भाषा को प्रोग्रामेटिक रूप से बदलें C99 बूलियन डेटा प्रकार? सफ़ल पाठ 2 कंसोल इनपुट क्या अस्थायी चर मेरे प्रोग्राम को धीमा कर देते हैं? AddBusinessDays और GetBusinessDays रोबोट-राउटर के साथ ब्राउज़र में कैसे रोकें?

जावा 2 बाइट्स में वर्ण का आकार नहीं है?

मैंने एक पाठ फ़ाइल से एक byte पढ़ने के लिए RandomAccessFile का उपयोग किया था।

 public static void readFile(RandomAccessFile fr) { byte[] cbuff = new byte[1]; fr.read(cbuff,0,1); System.out.println(new String(cbuff)); } 

मैं एक पूर्ण चरित्र को देखकर क्यों देख रहा हूं?

वेब के समाधान से एकत्रित समाधान "जावा 2 बाइट्स में वर्ण का आकार नहीं है?"

एक चरित्र जावा (*) में एक चरित्र का प्रतिनिधित्व करता है। यह 2 बाइट्स बड़ा है (कम से कम यह वही है जो वैध मूल्य सीमा सुझाती है)।

इसका जरूरी मतलब यह नहीं है कि प्रत्येक चरित्र का प्रतिनिधित्व 2 बाइट्स लंबा है। वास्तव में कई एन्कोडिंग केवल प्रत्येक चरित्र के लिए 1 बाइट आरक्षित करते हैं (या सबसे सामान्य वर्णों के लिए 1 बाइट का उपयोग करें)।

जब आप String(byte[]) कन्स्ट्रक्टर को कॉल करते हैं, तो आप जावा से पूछते हैं कि मंच डिफ़ॉल्ट डीफॉल्ट एन्कोडिंग का उपयोग करके एक String में byte[] को परिवर्तित करें। चूंकि प्लेटफ़ॉर्म डिफॉल्ट एन्कोडिंग आमतौर पर 1-बाइट एन्कोडिंग है जैसे कि आईएसओ -8859-1 या यूटीएफ -8 जैसे एक चर-लंबाई एन्कोडिंग, यह आसानी से उस 1 बाइट को एक ही वर्ण में कनवर्ट कर सकता है।

यदि आप उस कोड को मंच पर चलाते हैं जो UTF-16 (या UTF-32 या UCS-2 या UCS-4 या …) मंच डिफ़ॉल्ट एन्कोडिंग के रूप में उपयोग करता है, तो आपको एक वैध परिणाम नहीं मिलेगा (आपको मिलेगा एक String जिसमें यूनिकोड रिप्लेसमेंट कैरेक्टर के बजाय) शामिल हैं।

यह एक कारण है कि आपको प्लेटफ़ॉर्म डिफॉल्ट एन्कोडिंग पर निर्भर क्यों न होना चाहिए: जब byte[] और char[] / String या InputStream और Reader या OutputStream और Writer बीच में परिवर्तित हो, तो आपको हमेशा यह निर्दिष्ट करना चाहिए कि आप किस एन्कोडिंग का उपयोग करना चाहते हैं यदि आप नहीं करते हैं, तो आपका कोड प्लेटफॉर्म पर निर्भर होगा।

(*) जो पूरी तरह से सत्य नहीं हैं: एक char एक यूटीएफ -16 कोडपॉइंट का प्रतिनिधित्व करता है। या तो एक या दो यूटीएफ -16 कोडपॉइंट एक यूनिकोड कोडपॉइंट का प्रतिनिधित्व करते हैं। एक यूनिकोड कोडपॉइंट आम तौर पर एक चरित्र का प्रतिनिधित्व करता है, लेकिन कभी-कभी कई यूनिकोड कोडपॉइंट को एक एकल वर्ण बनाने के लिए उपयोग किया जाता है। लेकिन ऊपर दिए अनुमान के मुताबिक हाथ में विषय पर चर्चा करना काफी करीब है।

जावा अपने सभी "वर्ण" को आंतरिक रूप से दो बाइट्स के रूप में संग्रहीत करता है हालांकि, जब वे स्ट्रिंग आदि बनते हैं, बाइट्स की संख्या आपके एन्कोडिंग पर निर्भर करती है।

कुछ अक्षर (एएससीआईआई) एकल बाइट हैं, लेकिन कई अन्य बहु-बाइट हैं

जावा यूनिकोड का समर्थन करता है, इस प्रकार निम्नानुसार है:

जावा कैरेक्टर डॉक्स

समर्थित अधिकतम मूल्य "\ uFFFF" (हेक्स एफएफएफएफ, डीसी 65535), या 11111111 11111111 बाइनरी (दो बाइट्स) है।

कन्स्ट्रक्टर String(byte[] bytes) बाइट्स से बाइट्स लेता है और उन्हें वर्णों के लिए एन्कोड करता है।

यह वर्णों के लिए बाइट को एन्कोड करने के लिए मंच डिफ़ॉल्ट वर्णसेट का उपयोग करता है। अगर आप जानते हैं, आपकी फ़ाइल में पाठ है, जो एक भिन्न वर्णसेट में एन्कोड किया गया है, तो आप सही एन्कोडिंग (बाइट्स से वर्णों) का उपयोग करने के लिए String(byte[] bytes, String charsetName) का उपयोग कर सकते हैं।

एएससीआईआई पाठ फ़ाइल में प्रत्येक अक्षर सिर्फ एक बाइट है

ऐसा लगता है कि आपकी फ़ाइल में एएससीआईआई वर्ण हैं, जो कि सिर्फ 1 बाइट में एन्कोडेड हैं अगर पाठ फ़ाइल में गैर-एएससीआईआई वर्ण शामिल था, उदाहरण के लिए 2-बाइट यूटीएफ -8, तो आप केवल पहले बाइट प्राप्त करते हैं, संपूर्ण वर्ण नहीं।

यहां कुछ अच्छे उत्तर दिए गए हैं, लेकिन मैं कहना चाहता था कि जेवीएम किसी भी आकार के अंतरिक्ष में = 4 बाइट्स को स्टोर करने के लिए स्वतंत्र है।

कई आर्किटेक्चर पर बिना वर्जित स्मृति एक्सेस करने का जुर्माना होता है ताकि एक कक्ष आसानी से 4 बाइट्स में गढ़ा जा सके। झूठी साझाकरण को रोकने के लिए एक अस्थिर अक्षरों को सीपीयू कैश लाइन के आकार में भी पैड किया जा सकता है। https://en.wikipedia.org/wiki/False_sharing

यह नए जावा प्रोग्रामर के लिए सहज नहीं हो सकता है कि एक वर्ण सरणी या स्ट्रिंग केवल एकाधिक अक्षर नहीं है आपको "एकाधिक अक्षर" से स्पष्ट रूप से स्ट्रिंग्स और एरेज़ के बारे में सीखना और सोचना चाहिए।

मैं यह भी कहना चाहता हूं कि जावा के अक्षरों का अक्सर दुरुपयोग किया जाता है। लोगों को यह नहीं पता कि वे कोड लिख रहे हैं जो लंबाई में 16 बिट्स से कोडपॉइंट को ठीक से नहीं रखेगा।