अंग्रेजी वर्णों को अन्य वर्णमालाओं की तुलना में कम बाइट्स की आवश्यकता क्यों है?


31

जब मैं एक टेक्स्ट फाइल में 'a' डालता हूं, तो यह 2 बाइट्स बनाता है, लेकिन जब मैं डालता हूं, तो '' 'कहते हैं, जो अर्मेनियाई वर्णमाला का एक अक्षर है, यह इसे 3 बाइट्स बनाता है।

कंप्यूटर के लिए वर्णमाला के बीच अंतर क्या है?
अंग्रेजी कम जगह क्यों लेती है?


22
आपको StackExchange के संस्थापक द्वारा यह लेख पढ़ना चाहिए: joelonsoftware.com/articles/Unicode.html
Eric Lippert

22
मुझे नहीं लगता कि "अंग्रेजी अक्षर" जैसी कोई चीज है। वे रोमन हैं।
राफेल

5
@ राफेल हर कोई जानता है कि वह क्या जिक्र कर रहा है। लेकिन अच्छा जोड़।
मैथियास लिकेगार्ड लोरेंजेन

1
@ राफेल वास्तव में कई रोमन अक्षर हैं जो अंग्रेजी में उपयोग नहीं किए जाते हैं, और इस प्रकार ASCII वर्ण सेट में शामिल नहीं हैं। उनमें से अधिकांश में संशोधक शामिल हैं, लेकिन उन लोगों को अभी भी अंग्रेजी के अलावा अन्य लैटिन-व्युत्पन्न लैग्यूज में पाठ को ठीक से प्रस्तुत करने की आवश्यकता है।
वुटज़

7
@ राफेल मुझे नहीं लगता कि "रोमन अक्षर" जैसी कोई चीज है। वे लैटिन हैं।
ब्लैकलाइट शाइनिंग

जवाबों:


41

मुख्यधारा के कंप्यूटरों में उपयोग करने के लिए विकसित की जाने वाली पहली एन्कोडिंग योजनाओं में से एक ASCII ( सूचना मानक के लिए अमेरिकी मानक कोड ) मानक है। यह 1960 में संयुक्त राज्य अमेरिका में विकसित किया गया था।

अंग्रेजी वर्णमाला लैटिन वर्णमाला के भाग का उपयोग करती है (उदाहरण के लिए, अंग्रेजी में कुछ उच्चारण किए गए शब्द हैं)। मामले पर विचार न करते हुए उस वर्णमाला में 26 व्यक्तिगत पत्र हैं। और किसी भी योजना में व्यक्तिगत संख्या और विराम चिह्नों को भी मौजूद करना होगा जो अंग्रेजी वर्णमाला को एनकोड करने का दिखावा करते हैं।

1960 का समय एक ऐसा समय था जहां कंप्यूटर में मेमोरी या डिस्क स्थान की मात्रा नहीं थी जो अब हमारे पास है। ASCII को सभी अमेरिकी कंप्यूटरों में एक कार्यात्मक वर्णमाला के मानक प्रतिनिधित्व के रूप में विकसित किया गया था। उस समय, प्रत्येक ASCII वर्ण को 8 बिट (1 बाइट) लंबा बनाने का निर्णय उस समय के तकनीकी विवरणों के कारण किया गया था (विकिपीडिया लेख में इस तथ्य का उल्लेख है कि छिद्रित टेप में एक समय में 8 बिट्स की स्थिति होती है)। वास्तव में, मूल ASCII योजना को 7 बिट्स का उपयोग करके प्रेषित किया जा सकता है, आठ का उपयोग समता जांच के लिए किया जा सकता है। बाद के घटनाक्रमों ने मूल ASCII योजना का विस्तार किया जिसमें कई उच्चारण, गणितीय और टर्मिनल वर्ण शामिल थे।

दुनिया भर में हाल ही में कंप्यूटर के उपयोग में वृद्धि के साथ, विभिन्न भाषाओं के अधिक से अधिक लोगों के पास कंप्यूटर तक पहुंच थी। इसका मतलब था कि, प्रत्येक भाषा के लिए, नई एन्कोडिंग योजनाओं को अन्य योजनाओं से स्वतंत्र रूप से विकसित किया जाना था, जो कि अगर विभिन्न भाषा टर्मिनलों से पढ़ें तो संघर्ष होगा।

यूनिकोड सभी संभव सार्थक वर्णों को एक एकल सार वर्ण सेट में विलय करके, विभिन्न टर्मिनलों के अस्तित्व के समाधान के रूप में आया।

UTF-8 यूनिकोड वर्ण सेट को एनकोड करने का एक तरीका है। यह एक चर-चौड़ाई एन्कोडिंग है (उदाहरण के लिए विभिन्न वर्णों के अलग-अलग आकार हो सकते हैं) और इसे पूर्व ASCII योजना के साथ पीछे की संगतता के लिए डिज़ाइन किया गया था। इस प्रकार, ASCII वर्ण सेट एक बाइट बड़ा रहेगा जबकि अन्य वर्ण दो या अधिक बाइट्स बड़े होंगे। यूटीएफ -16 यूनिकोड वर्ण सेट को एनकोड करने का एक और तरीका है। UTF-8 की तुलना में, वर्णों को एक या दो 16-बिट कोड इकाइयों के एक सेट के रूप में एन्कोड किया गया है।

जैसा कि टिप्पणियों पर कहा गया है, 'एक' चरित्र एक एकल बाइट पर कब्जा कर लेता है जबकि '' 'एक यूटीएफ -8 एन्कोडिंग को दर्शाते हुए दो बाइट्स रखता है। आपके प्रश्न में अतिरिक्त बाइट अंत में एक नई लाइन चरित्र के अस्तित्व के कारण था (जो ओपी के बारे में पता चला)।


26
कोई अंतिम बाइट नहीं है जो किसी भी सामान्य एन्कोडिंग या फ़ाइल प्रारूप में फ़ाइल के अंत को कोड करता है। जब कोई प्रोग्राम फ़ाइल पढ़ता है, तो फ़ाइल का अंत ओएस द्वारा एक विशेष तरीके से संकेत दिया जा सकता है, लेकिन यह एक अलग मुद्दा है।
जुक्का के। कोर्पेला

2
यूनिकोड के यूटीएफ -8 संस्करण में 5 वर्ण 2 बाइट्स (0xD5A1) है; अतिरिक्त चरित्र (जो कुछ भी है) दोनों फाइलों में मौजूद है। Marathon-studios.com/unicode/U0561/Ararten_Small_Letter_Ayb
Dan Neely

6
@khajvah यदि आप echo 'ա' > file.txtइसे करते हैं, या कुछ संपादकों का उपयोग करके फ़ाइल को संपादित करते हैं, तो वे स्वचालित रूप से इसके बाद एक नई पंक्ति जोड़ते हैं। यदि आप चलाते हैं xxd file.txt, तो अंतिम बाइट संभवतः एक 0a, या लाइन फीड होगी।
डैनियल बेक

7
@ डॉकटोरो रीचर्ड: कृपया उत्तर में स्पष्ट करें कि यूनिकोड एन्कोडिंग नहीं है ; बल्कि, यह एक सार वर्ण सेट है, और UTF-16 और UTF-8 यूनिकोड कोडपॉइंट्स के एन्कोडिंग हैं। आपके उत्तर के अंतिम पैराग्राफ ज्यादातर UTF-8 के बारे में बात करते हैं। लेकिन अगर कोई फ़ाइल UTF-16 का उपयोग करती है, तो कोई कोडपॉइंट, यहां तक ​​कि एक के लिए aदो बाइट्स (या दो में से एक) का उपयोग करेगा।
ग्रिटिटी

6
यह शायद इस बात पर भी जोर देने के लायक है कि "विस्तारित एएससीआईआई" चरित्र सेट वास्तव में एएससीआईआई बिल्कुल नहीं हैं, और आठवें बिट का उपयोग करने के विभिन्न तरीकों की संख्या इसे सभी बड़ी गड़बड़ बनाती है। इसके बजाय बस UTF-8 का उपयोग करें।
ntoskrnl

17

1 बाइट 8 बिट्स है, और इस तरह 256 (2 ^ 8) विभिन्न मूल्यों का प्रतिनिधित्व कर सकते हैं।

जिन भाषाओं के लिए इससे अधिक संभावनाओं की आवश्यकता होती है, उनके लिए एक सरल 1 से 1 मैपिंग को बनाए नहीं रखा जा सकता है, इसलिए किसी चरित्र को संग्रहीत करने के लिए अधिक डेटा की आवश्यकता होती है।

ध्यान दें कि आम तौर पर, अधिकांश एनकोडिंग ASCII वर्णों के लिए पहले 7 बिट्स (128 मान) का उपयोग करते हैं । यह 8 बिट या अधिक वर्णों के लिए 128 मान छोड़ता है। । । उच्चारण पात्रों, एशियाई भाषाओं, सिरिलिक आदि में जोड़ें, और आप आसानी से देख सकते हैं कि सभी पात्रों को रखने के लिए 1 बाइट पर्याप्त क्यों नहीं है।


तो यहाँ केवल एक ही जवाब है कि वास्तव में यह समझाने के लिए कि अधिक स्थान का उपयोग क्यों किया जाता है
फेलिक्स गगनोन-ग्रेनियर

10

UTF-8 में, ASCII वर्ण एक बाइट का उपयोग करते हैं, अन्य वर्ण दो, तीन या चार बाइट्स का उपयोग करते हैं।


1
क्या आप इस बारे में विस्तार से बता सकते हैं कि यह क्यों है? दो एन्कोडिंग विधियों को नोट करने से सवाल का जवाब नहीं मिलता है।
MaQleod

ASMII को बदलने के लिए @MaQleod यूनिकोड बनाया गया था। पीछे की संगतता के लिए, पहले 128 वर्ण समान हैं। इन 128 पात्रों को एक बाइट के साथ व्यक्त किया जा सकता है। अतिरिक्त बाइट्स अतिरिक्त वर्णों के लिए जोड़े जाते हैं।
जेसन

मुझे पता है, लेकिन यह इस सवाल के जवाब का हिस्सा है कि एएससीआईआई के चरित्र अलग-अलग हैं। इसे ओपी को समझाया जाना चाहिए।
Maqleod

@MaQleod यह भी कहा जा सकता है कि यूनिकोड कंसोर्टियम में ज्यादातर अमेरिकी निगम शामिल थे और अंग्रेजी भाषा के पात्रों के पक्षपाती थे। मैंने सोचा कि एक व्यक्तिपरक की तुलना में एक सरल उत्तर बेहतर था।
जेसन

15
UTF8 में "यूनिकोड" में नहीं, - जो यूनिकोड वर्ण सेट के कई एन्कोडिंग में से एक है।
सेबस्टियन नेग्रास्ज़स

3

एक चरित्र के लिए बाइट्स की मात्रा (जो कि प्रश्न के बारे में स्पष्ट रूप से है) चरित्र एन्कोडिंग पर निर्भर करता है। यदि आप आर्मस्सिएक एन्कोडिंग का उपयोग करते हैं, तो प्रत्येक आर्मीनियाई पत्र बस एक बाइट पर कब्जा कर लेता है। यह इन दिनों एक अच्छा विकल्प नहीं है, हालांकि।

यूनिकोड के लिए यूटीएफ -8 हस्तांतरण एन्कोडिंग में, पात्रों को अलग-अलग संख्या में बाइट्स की आवश्यकता होती है। इसमें, "एक" केवल एक बाइट लेता है (दो बाइट्स के बारे में विचार किसी तरह का भ्रम है), "á" दो बाइट्स लेता है, और अर्मेनियाई अक्षर ayb "ա" दो बाइट्स भी लेता है। तीन बाइट्स किसी तरह का कन्फ्यूजन होना चाहिए। इसके विपरीत, उदाहरण के लिए, बंगाली पत्र "অ" UTF-8 में तीन बाइट्स लेता है।

पृष्ठभूमि बस इतनी है कि UTF-8 को Ascii वर्णों के लिए बहुत कुशल बनाया गया था, यूरोप और परिवेश में लेखन प्रणालियों के लिए काफी कुशल है, और बाकी सभी कम कुशल हैं। इसका मतलब यह है कि मूल लैटिन अक्षरों (जो कि अंग्रेजी पाठ में ज्यादातर शामिल हैं), एक चरित्र के लिए केवल एक बाइट की आवश्यकता होती है; ग्रीक, सिरिलिक, अर्मेनियाई और कुछ अन्य लोगों के लिए, दो बाइट्स की आवश्यकता होती है; बाकी सभी को ज्यादा जरूरत है।

UTF-8 के पास (जैसा कि एक टिप्पणी में बताया गया है) यह भी उपयोगी संपत्ति है कि Ascii डेटा (जब 8-बिट इकाइयों के रूप में प्रतिनिधित्व किया जाता है, जो लगभग लंबे समय तक एकमात्र तरीका रहा है) तुच्छ रूप से UTF-8 है, भी।


जवाब के लिए धन्यवाद। अतिरिक्त बाइट्स हैं क्योंकि प्रोग्राम जो मैंने स्वचालित रूप से उपयोग किया था, अंत में नई लाइन वर्ण जोड़ा।
खाजवाह

1
मुझे नहीं लगता कि UTF-8 ASCII डेटा के साथ संगतता के लिए दक्षता के लिए बहुत डिज़ाइन किया गया था । UTF-8 की बहुत अच्छी संपत्ति है कि 7-बिट ASCII सामग्री (उच्च बिट के साथ शून्य पर सेट) उसी सामग्री के समान है जो UTF-8 के रूप में एन्कोडेड है, इसलिए सामान्य रूप से ASCII से निपटने वाले उपकरणों के लिए, यह एक ड्रॉप-इन प्रतिस्थापन है । किसी अन्य यूनिकोड एन्कोडिंग योजना के पास वह संपत्ति नहीं है, मेरी जानकारी के लिए। UTF-8 भी अधिकांश डेटा के लिए यथोचित रूप से कॉम्पैक्ट है, खासकर यदि आप यूनिकोड बीएमपी के दायरे में रहते हैं ।
एक CVn

1
@ माइकलकॉर्जलिंग, मैंने उस सुविधा का एक संदर्भ जोड़ा है। हालाँकि, शुरुआती दिनों में यूनिकोड के लिए एक बड़ी आपत्ति अक्षमता थी, और UTF-16 डेटा के आकार को दोगुना कर देता है जो प्रमुख रूप से Ascii है। UTF-8 का अर्थ है, उदाहरण के लिए, अंग्रेजी पाठ के लिए, कि आप केवल उन गैर-असिस्की पात्रों के लिए "भुगतान" करें जिनका आप उपयोग करते हैं।
जुक्का के। कोर्पेला

3

1960 के दशक में (और लंबे समय से परे) वर्ण कोड मशीन-विशिष्ट थे। 1980 के दशक में मैंने संक्षेप में DEC 2020 मशीन का उपयोग किया था, जिसमें 36 बिट शब्द थे, और 5, 6 और 8 ( IIRC ) बिट्स प्रति चरित्र एन्कोडिंग थे। इससे पहले, मैंने ईबीसीडीआईसी के साथ आईबीएम 370 श्रृंखला का उपयोग किया था। एएससीआईआई 7 बिट्स के साथ आदेश लाया, लेकिन इसे आईबीएम पीसी के साथ एक गड़बड़ी मिली "अतिरिक्त कोड का प्रतिनिधित्व करने के लिए सभी 8 बिट्स का उपयोग करके" बॉक्सिंग ", जैसे कि सभी प्रकार के बॉक्स ड्राइंग आदिम मेनू को चित्रित करने के लिए, और बाद में लैटिन -1 (8 बिट) जैसे एएससीआईआई एक्सटेंशन एन्कोडिंग, ASCII जैसे पहले 7 बिट्स के साथ और दूसरे आधे "राष्ट्रीय पात्रों" जैसे ñ, Çया अन्य के लिए। संभवतः सबसे लोकप्रिय लैटिन -1 था, लैटिन वर्णों (और लहजे और वेरिएंट) का उपयोग करके अंग्रेजी और अधिकांश यूरोपीय भाषाओं के अनुरूप।

टेक्स्ट मिक्सिंग लिखना जैसे अंग्रेज़ी और स्पैनिश ठीक हो गया (बस लैटिन -1, दोनों के सुपरसेट का उपयोग करें), लेकिन किसी भी चीज़ को मिलाकर जो एक अलग एन्कोडिंग का उपयोग करता है (जैसे कि ग्रीक, या रूसी का एक स्निपेट शामिल है, जापानी जैसी एशियाई भाषा का उल्लेख नहीं करना था) एक बुरा सपना। सबसे बुरा यह था कि रूसी और विशेष रूप से जापानी और चीनी कई लोकप्रिय, पूरी तरह से असंगत एन्कोडिंग थे।

आज हम यूनिकोड का उपयोग करते हैं, जो कि अंग्रेजी वर्णों के अनुकूल UTF-8 की तरह कुशल एन्कोडिंग है, (आश्चर्यजनक रूप से, अंग्रेजी अक्षरों के लिए एन्कोडिंग सिर्फ ASCII के अनुरूप होता है) इस प्रकार कई गैर-अंग्रेजी वर्ण लंबे एन्कोडिंग का उपयोग करते हैं।


2

विंडोज 8.1 यूएस / इंग्लिश फाइल विथ सिंगल 'ए' नोटपैड के साथ सेव किया गया।

  • ANSI 1 बाइट के रूप में सहेजें
  • यूनिकोड 4 बाइट के रूप में सहेजें
  • UTF-8 4 बाइट्स के रूप में सहेजें

नोटपैड के साथ सहेजे गए एकल 'ա' के साथ फाइल करें

  • ASSI संभव नहीं के रूप में सहेजें
  • यूनिकोड 4 बाइट के रूप में सहेजें
  • UTF-8 5 बाइट्स के रूप में सहेजें

ANSI में एक सिंगल 'a' को सिंगल बाइट के रूप में एनकोड किया गया है, प्रत्येक कैरेक्टर में आमतौर पर 2 बाइट्स होते हैं। फाइल की शुरुआत में एक 2 बाइट BOM (बाइट ऑर्डर मार्कर) भी होता है। UTF-8 में 3 बाइट BOM और एकल बाइट चरित्र है।

'AN' के लिए वह चरित्र ANSI वर्ण सेट में मौजूद नहीं है और मेरी मशीन पर सहेजा नहीं जा सकता। यूनिकोड फ़ाइल पहले की तरह ही है, और यूटीएफ -8 फ़ाइल 1 बाइट बड़ी है क्योंकि चरित्र 2 बाइट्स लेता है।

यदि आपकी मशीन एक अलग क्षेत्र से है, तो आपके पास एक अलग OEM कोड पेज स्थापित हो सकता है जिसमें ASCII रेंज में संभव 255 वर्णों के लिए अलग-अलग ग्लिफ़ हों। जैसा कि @ntoskrnl ने उल्लेख किया है कि मेरी मशीन के लिए OEM कोडपेज विंडोज -1252 होगा जो यूएस अंग्रेजी के लिए डिफ़ॉल्ट है।


4
नोटपैड (और सामान्य रूप से विंडोज) यहां भ्रामक शब्दावली का उपयोग करता है। "एएनएसआई" एक स्थानीय-निर्भर एकल बाइट एन्कोडिंग (अंग्रेजी संस्करणों पर विंडोज -1252), और "यूनिकोड" यूटीएफ -16 है।
ntoskrnl

@ntoskrnl यह सही है, लेकिन अगर आप एन्कोडिंग के लिए ड्रॉप बॉक्स में देख रहे हैं, तो यह एएनएसआई कहता है, यही कारण है कि यदि आपके पास एक अलग OEM कोडपेज है, तो आप अलग-अलग परिणाम प्राप्त कर सकते हैं।
डेरिल ब्राटन

2

यदि आप रुचि रखते हैं कि पात्रों को कैसे संग्रहीत किया जाता है, तो आप www.unicode.org पर जा सकते हैं और चारों ओर देख सकते हैं। उनके मुख्य पृष्ठ के शीर्ष पर एक लिंक "कोड चार्ट" है जो आपको यूनिकोड में उपलब्ध सभी वर्ण कोड दिखाता है।

सभी में, यूनिकोड में उपलब्ध एक लाख से अधिक कोड हैं (उनमें से सभी का उपयोग नहीं किया गया है)। एक बाइट में 256 अलग-अलग मान हो सकते हैं, इसलिए यदि आपको हर संभव यूनिकोड कोड स्टोर करना है तो आपको तीन बाइट्स की आवश्यकता होगी।

इसके बजाय, यूनिकोड आमतौर पर "UTF-8" एन्कोडिंग में संग्रहीत होता है जो कुछ वर्णों के लिए कम बाइट्स का उपयोग करता है और दूसरों के लिए अधिक। पहले 128 कोड मान एक बाइट में संग्रहीत किए जाते हैं, पहले 2048 तक कोड मान दो बाइट्स में संग्रहीत किए जाते हैं, 65536 तक तीन बाइट्स में संग्रहीत किए जाते हैं, और बाकी चार बाइट्स लेते हैं। इसे व्यवस्थित किया गया है ताकि कोड मान जो अधिक उपयोग किए जाते हैं वे कम जगह लेते हैं। AZ, az, 0-9 और! @ $% ^ & * () - [} {}; ":", /; / <> और कुछ जो मैं एक बाइट लेना भूल गया, लगभग सभी अंग्रेजी, 98%; जर्मन और फ्रेंच (केवल अनुमान लगाने) को प्रति चरित्र एक बाइट में संग्रहीत किया जा सकता है, और ये ऐसे अक्षर हैं जो सबसे अधिक उपयोग किए जाते हैं। सिरिलिक, ग्रीक, हिब्रू, अरबी और कुछ अन्य प्रति चरित्र दो बाइट्स का उपयोग करते हैं। भारतीय भाषाएं, अधिकांश चीनी, जापानी , कोरियाई, थाई, गणितीय प्रतीकों के टन, प्रति चरित्र में तीन बाइट्स में लिखा जा सकता है। दुर्लभ चीजें (यदि आप कभी रैखिक ए या रैखिक बी, इमोजीस में पाठ लिखना चाहते हैं) तो चार बाइट लें।

एक अन्य एन्कोडिंग UTF-16 है। सब कुछ जो UTF-8 में 1, 2 या 3 बाइट्स लेता है, UTF-16 में दो बाइट्स लेता है। यह एक फायदा है अगर आप चीनी या जापानी पाठ के बीच बहुत कम लैटिन अक्षर हैं।

UTF-8 डिज़ाइन के कारणों के बारे में: अन्य डिज़ाइनों के मुकाबले इसके कई फायदे हैं। वो हैं:

यूएस-एएससीआईआई पात्रों के साथ संगतता

उचित कॉम्पैक्टिसिटी

स्व-सिंक्रनाइज़ेशन: इसका मतलब है कि अगर आपको यूटीएफ -8 एन्कोडिंग में पात्रों के बाइट्स के एक भाग का हिस्सा दिया जाता है, तो आप यह पता लगा सकते हैं कि चरित्र कहाँ शुरू होता है। कुछ एन्कोडिंग्स में, xy और yx दोनों ही वर्णों के मान्य एनकोडिंग हो सकते हैं, इसलिए यदि आपको किसी अनुक्रम का हिस्सा दिया जाता है ... xyxyxyxyxyxy ... आप यह नहीं जान सकते कि आपके पास कौन से वर्ण हैं।

क्रमबद्धता क्रमबद्धता: यदि आप अपने बाइट मानों द्वारा UTF-8 एन्कोड किए गए तार को सॉर्ट करते हैं, तो वे अपने यूनिकोड मानों के अनुसार स्वचालित रूप से सही ढंग से सॉर्ट किए जाते हैं।

एकल-बाइट कोड के साथ संगत: अधिकांश कोड जो एकल बाइट मानों को मानता है, UTF-8 एन्कोडेड वर्णों के साथ स्वचालित रूप से सही ढंग से काम करता है।

साथ ही जो भी कारण मुझे भूल गए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.