ASCII मौलिक
मूल रूप से 1 चरित्र हमेशा 1 बाइट के रूप में जमा किया गया है। एक बाइट (8 बिट्स) में 256 संभावित मानों को अलग करने की क्षमता है। लेकिन वास्तव में केवल पहले 7 बिट्स का उपयोग किया गया था। तो केवल 128 वर्ण परिभाषित किए गए थे। इस सेट को ASCII वर्ण सेट के रूप में जाना जाता है।
0x00
- 0x1F
स्टीयरिंग कोड (जैसे सीआर, वामो, एसटीएक्स, ETX, ईओटी, BEL, शामिल ...)
0x20
- 0x7F
शामिल ज्यादातर वर्णमाला वर्ण
0x80
- - 0xFF
8 बिट = अपरिभाषित 0x40
संख्या और विराम चिह्न
0x41
होते हैं।
फ्रेंच, जर्मन और कई अन्य भाषाओं को अतिरिक्त पात्रों की आवश्यकता है। (उदाहरण के लिए à, é, ç, ô, ...
) जो ASCII चरित्र सेट में उपलब्ध नहीं थे। इसलिए उन्होंने अपने पात्रों को परिभाषित करने के लिए 8 वें बिट का उपयोग किया। यह "विस्तारित ASCII" के रूप में जाना जाता है।
समस्या यह है कि अतिरिक्त 1 बिट में दुनिया की सभी भाषाओं को कवर करने की पर्याप्त क्षमता नहीं है। इसलिए प्रत्येक क्षेत्र में अपना स्वयं का ASCII संस्करण होता है। कई विस्तारित ASCII एन्कोडिंग (latin-1
बहुत लोकप्रिय हैं)।
लोकप्रिय प्रश्न: "ASCII कोई वर्ण सेट है या यह कोई एन्कोडिंग कि"? ASCII
एक चरित्र सेट है। हालांकि, charset
और encoding
प्रोग्रामिंग में जंगली रूप से समानार्थी के रूप में उपयोग किया जाता है। अगर मैं एन्कोडिंग को संदर्भित करना चाहता हूं जिसमें केवल ASCII वर्ण हैं और कुछ और नहीं है (8 वां बिट हमेशा 0 है): यह US-ASCII
है।
यूनिकोड एक कदम आगे चला जाता है
Unicode भी एक वर्ण सेट (नहीं एक एन्कोडिंग) है। यह ASCII मानक जैसे समान वर्णों का उपयोग करता है, लेकिन यह अतिरिक्त वर्णों के साथ सूची को विस्तारित करता है, जो प्रत्येक वर्ण को u+xxxx
प्रारूप में कोडपॉइंट देता है। इसमें पूरी दुनिया में उपयोग किए जाने वाले सभी पात्रों (और लोकप्रिय आइकन) को शामिल करने की महत्वाकांक्षा है।
यूटीएफ -8, यूटीएफ -16 और यूटीएफ -32 एन्कोडिंग हैं जो यूनिकोड चरित्र तालिका लागू करते हैं। लेकिन उनमें से प्रत्येक को एन्कोड करने के तरीके पर थोड़ा अलग तरीका है। यूटीएफ -8 केवल एएससीआईआई चरित्र को एन्कोड करते समय 1 बाइट का उपयोग करेगा, जो किसी भी अन्य ASCII एन्कोडिंग के समान आउटपुट देगा। लेकिन अन्य पात्रों के लिए, यह इंगित करने के लिए पहली बिट का उपयोग करेगा कि दूसरा बाइट का पालन करेगा।
GBK एक एन्कोडिंग है, जो यूटीएफ -8 की तरह कई बाइट्स का उपयोग करता है। पहला बाइट ASCII मानक का पालन करता है, इसलिए केवल 7 बिट्स का उपयोग किया जाता है। 8 वीं बिट का उपयोग दूसरी बाइट की उपस्थिति को इंगित करने के लिए किया जाता है, जिसका उपयोग लगभग 22,000 चीनी वर्णों का प्रतिनिधित्व करने के लिए किया जाता है। लेकिन एक महत्वपूर्ण अंतर यह है कि यह यूनिकोड चरित्र सेट का सम्मान नहीं करता है।
माइम प्रकार
माइम प्रकार भी अक्सर एन्कोडिंग समझ लिया जाता है।
फ़ाइल को डीकोड करने का कोई सीधा तरीका नहीं है। यह सभी आदर्श होगा यदि सभी फाइलों में यह इंगित करने के लिए उपसर्ग होता है कि उनके डेटा को एन्कोडिंग किस प्रकार संग्रहीत किया गया था। अंत में यह एन्कोडिंग (उदाहरण के लिए US-ASCII
, UTF-8
, कुछ सिस्टम डिफ़ॉल्ट निर्धारित करने के लिए एप्लिकेशन (या इसके डेवलपर) पर निर्भर करता है। ..)।
इंटरनेट पर डेटा भेजते समय एक ही समस्या मौजूद है।सौभाग्य से कुछ प्रोटोकॉल जैसे HTTP उपयोग माइम प्रकार घोषणाएं यह निर्दिष्ट करने के लिए कि किस प्रकार का डेटा और डेटासेट डेटा का उपयोग करता है। एक ठेठ HTTP शीर्ष लेख इस में शामिल हैं:
Content-Type: text/html; charset=utf-8
लेकिन text/xml
कि व्यर्थ होगा (क चारसेट पैरामीटर भी नजरअंदाज कर दिया जाएगा)। सामान्य रूप से एक्सएमएल पार्सर फ़ाइल की पहली पंक्ति पढ़ेंगे, <?xml encoding=...
टैग की तलाश में। यदि यह वहां है, तो वे उस एन्कोडिंग का उपयोग कर फ़ाइल को फिर से खोल देंगे।
वही समस्या when sending e-mails मौजूद है। एक ई-मेल में एक HTML संदेश या केवल सादा पाठ हो सकता है।
शॉर्टकट
एन्कोडिंग के खतरों के अलावा जावा (और कई अन्य प्रोग्रामिंग भाषाओं) के मामले में, वहाँ भी पात्रों को बाइट्स और पूर्णांकों कास्टिंग क्योंकि उनकी सामग्री विभिन्न श्रेणियों में संग्रहित है की जटिलता है।
- एक बाइट एक हस्ताक्षरित बाइट (:
-128
127
लिए रेंज) के रूप में संग्रहीत किया जाता है।
- एक धारा
255
को सीमा -1
में एक पूर्णांक देता है: - (65535
0
रेंज)
- जावा में
char
टाइप 2 अहस्ताक्षरित बाइट्स में संग्रहित है।
यदि आप जानते हैं कि आपके डेटा में केवल ASCII मान हैं। फिर उचित कौशल के साथ आप बाइट्स से अपने डेटा को वर्णों में पार्स कर सकते हैं या स्ट्रिंग्स में तुरंत लपेट सकते हैं।
// the -1 indicates that there is no data
int input = stream.read();
if (input == -1) throw new EOFException();
// bytes must be made positive first.
byte myByte = (byte) input;
int unsignedInteger = myByte & 0xFF;
char ascii = (char)(unsignedInteger);
जावा में शॉर्टकट पाठकों और लेखकों उपयोग करने के लिए और जब आप उन्हें का दृष्टांत एनकोडिंग निर्दिष्ट करने की है।
// wrap your stream in a reader.
// specify the encoding
// The reader will decode the data for you
Reader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
के रूप में एक्सएमएल फाइल यह नहीं बात है कि बहुत है, क्योंकि किसी भी सभ्य डोम या JAXB marshaller कोई एन्कोडिंग विशेषता के लिए जाँच करेगा करता है के लिए पहले समझाया।
इसके लिए क्लासिक ऑफ़-साइट संसाधन जोएल स्पॉल्स्की का निबंध है [_ निरपेक्ष न्यूनतम प्रत्येक सॉफ्टवेयर डेवलपर बिल्कुल, यूनिकोड और कैरेक्टर सेट्स (कोई बहाना नहीं है!) के बारे में सकारात्मक रूप से जानना चाहिए (http://www.joelonsoftware.com/ लेख/Unicode.html)। – Raedwald
यह देर से उत्तर दिया गया है, लेकिन मैंने उल्लिखित एन्कोडिंग और वर्णमाला के बारे में कुछ स्पष्टीकरण पोस्ट किए हैं + कुछ शॉर्टकट्स (उदाहरण के लिए जावा के लिए) – bvdb