UTF-8 पर ASCII एन्कोडिंग चुनने का क्या फायदा है?


91

ASCII में सभी पात्रों को स्टोरेज में वृद्धि के बिना UTF-8 का उपयोग करके एन्कोड किया जा सकता है (दोनों को भंडारण की बाइट की आवश्यकता होती है)।

UTF-8 में "ASCII- वर्ण" से परे चरित्र समर्थन का अतिरिक्त लाभ है। अगर ऐसा है, तो हम कभी भी UTF-8 पर ASCII एन्कोडिंग क्यों चुनेंगे?

क्या कोई उपयोग-मामला है जब हम UTF-8 के बजाय ASCII का चयन करेंगे?


9
विरासत सामान का समर्थन करने के लिए ...
fretje

9
मेरा मतलब UTF8 है legacily भी ASCII समर्थन। यहां तक ​​कि अगर आपको विरासत सामान का समर्थन करना है, तो UTF8 ठीक काम करेगा जो किसी अन्य परिवर्तन की आवश्यकता नहीं है।
पचेरियर

3
हो सकता है कि आप एक प्रणाली है कि 8 ASCII वर्णों को 7 बाइट्स में पैक करता है के साथ हस्तक्षेप करने के लिए मिला है? लोगों ने चीजों को फिट करने के लिए पागल चीजें कीं ।
डोनल फैलो

4
मुझे पागल बुलाओ, लेकिन मैं सुरक्षा और स्थिरता कहूंगा। मल्टी-बाइट सीक्वेंस के बिना सेट किया गया एक चरित्र को तोड़ने के लिए बहुत कठिन है। मुझे गलत मत समझो, जब मानव भाषा का समर्थन महत्वपूर्ण है ASCII इसे काट नहीं करेगा। लेकिन अगर आप सिर्फ कुछ बुनियादी प्रोग्रामिंग कर रहे हैं और मूल भाषा में खुद को निचोड़ सकते हैं तो संकलक और ऑपरेटिंग सिस्टम के लिए लिखा गया था, जटिलता क्यों जोड़ें? @ डॉनल फेलो पिछले मैं जाँच की ... ASCII है 7 बाइट्स। (उस अतिरिक्त बिट के साथ कुछ भी सिर्फ ASCII नहीं है और परेशानी पूछ रहा है)
ebyrob

2
@ebyrob मुझे लगता है कि डोनल फेलो का मतलब है कि 8 बाइट्स को 7 बाइट्स में पैक करना, क्योंकि प्रत्येक सिंबल 7 बिट्स का उपयोग कर रहा है ... 8 * 7 = 56 बिट्स = 7 बाइट्स। इसका मतलब होगा कि एक विशेष एनकोड और डिकोड फ़ंक्शन, हर 1 में से 1 बाइट को स्टोरेज से बचाना है।
dodgy_coder

जवाबों:


83

कुछ मामलों में यह व्यक्तिगत पात्रों तक पहुंच को तेज कर सकता है। str='ABC'UTF8 और ASCII में एन्कोडेड स्ट्रिंग की कल्पना करें (और यह मानते हुए कि एन्कोडिंग के बारे में भाषा / संकलक / डेटाबेस जानता है)

Cसरणी-एक्सेस ऑपरेटर का उपयोग करके इस स्ट्रिंग से तीसरे ( ) वर्ण तक पहुंचने के लिए जो कई प्रोग्रामिंग भाषाओं में चित्रित किया गया है आप कुछ ऐसा करेंगे c = str[2]

अब, यदि स्ट्रिंग ASCII एन्कोडेड है, तो हमें केवल स्ट्रिंग से तीसरा बाइट प्राप्त करना है।

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

यह कुछ डेटाबेस इंजनों में उदाहरण के लिए एक मुद्दा है, जहां 'UTF-8 एनकोडेड VARCHAR के बाद' एक कॉलम की शुरुआत की खोज करने के लिए, डेटाबेस को केवल इस बात की जाँच करने की आवश्यकता नहीं है कि VARCHAR क्षेत्र में कितने वर्ण हैं, लेकिन कैसे कई बाइट्स उनमें से हर एक का उपयोग करता है।


3
यदि डेटाबेस "कैरेक्टर काउंट" और "बाइट काउंट" दोनों को स्टोर नहीं करता है , तो मैं कहूंगा कि यह कुछ समस्याएं हैं ...
डीन हार्डिंग

1
टीबीएच मुझे नहीं पता कि कोई डेटाबेस है जो या तो स्टोर करेगा ...
मचल

@ मैक: आप कैसे कल्पना करते हैं कि डेटाबेस जानता है जब यह स्ट्रिंग के अंत तक पहुँच गया है?
केविन क्लाइन

1
आमतौर पर 0x00 या 0x0000 तक पहुंचकर
Mchl

4
@ डीनहेयरिंग चरित्र आपको कैसे बताता है कि दूसरा चरित्र कहाँ शुरू होता है? या डेटाबेस प्रत्येक चरित्र ऑफसेट के लिए एक सूचकांक भी रखना चाहिए? नोट: यह सिर्फ 2 वर्ण नहीं है, लेकिन 4 तक हो सकता है (जब तक कि यह 6 नहीं हो) stackoverflow.com/questions/9533258/… । (मुझे लगता है कि यह केवल utf-16 है जिसमें वास्तव में लंबे समय तक घृणा थी जो आपके सिस्टम को नष्ट कर सकती थी)
ebyrob

7

यदि आप यूटीएफ -8 के केवल यूएस-एएससीआईआई (या आईएसओ 646) सबसेट का उपयोग करने जा रहे हैं, तो एक या दूसरे के लिए कोई वास्तविक लाभ नहीं है; वास्तव में, सब कुछ अनौपचारिक रूप से एन्कोडेड है।

यदि आप US-ASCII वर्ण सेट से आगे जाने वाले हैं, और उदाहरण के लिए (उदाहरण के लिए) वर्णों के साथ, umlauts, आदि का उपयोग करते हैं, जो कि विशिष्ट पश्चिमी यूरोपीय भाषाओं में उपयोग किए जाते हैं, तो एक अंतर है - इनमें से अधिकांश अभी भी हो सकते हैं आईएसओ 8859 में एक ही बाइट के साथ एनकोड किया जा सकता है, लेकिन UTF-8 में एनकोड किए जाने पर दो या अधिक बाइट्स की आवश्यकता होगी। निश्चित रूप से, नुकसान भी हैं: आईएसओ 8859 के लिए आवश्यक है कि आप उपयोग किए जा रहे एन्कोडिंग को निर्दिष्ट करने के लिए बैंड से कुछ का उपयोग करें, और यह केवल एक का समर्थन करता हैएक समय में इन भाषाओं में। उदाहरण के लिए, आप सिरिलिक (रूसी, बेलोरिशियन, आदि) के सभी पात्रों को केवल एक बाइट एप्लायस का उपयोग करके वर्णमाला में एन्कोड कर सकते हैं, लेकिन यदि आपको फ्रेंच या स्पैनिश पात्रों के साथ मिश्रण करने की आवश्यकता है / (यूएस-एएससीआईआई में उन लोगों के अलावा) / आईएसओ 646 सबसेट) आप भाग्य से बहुत बाहर हैं - आपको ऐसा करने के लिए चरित्र सेट को पूरी तरह से बदलना होगा।

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


5

एएनएसआई कई चीजें हो सकती हैं, इस संबंध में सबसे अधिक 8 बिट चरित्र सेट हैं (जैसे विंडोज के तहत कोड पेज 1252)।

शायद आप ASCII के बारे में सोच रहे थे जो 7-बिट और UTF-8 का एक उचित उपसमूह है। यानी कोई भी मान्य ASCII स्ट्रीम भी एक वैध UTF-8 स्ट्रीम है।

यदि आप 8-बिट वर्ण सेट के बारे में सोच रहे थे, तो एक बहुत महत्वपूर्ण लाभ यह होगा कि सभी प्रतिनिधित्व योग्य अक्षर 8-बिट्स हैं, जहां UTF-8 में वे 24 बिट तक हो सकते हैं।


हाँ मैं 7-बिट ASCII सेट के बारे में बात कर रहा हूँ। क्या आप 1 लाभ के बारे में सोच सकते हैं, हमें कभी भी utf-8 के बजाय ascii के रूप में कुछ बचाने की आवश्यकता होगी? (चूँकि 7-बिट को वैसे भी 8-बिट के रूप में सहेजा जाएगा,
फ़ाइलें

1
यदि आपके पास यूनिकोड मान 127 से बड़ा है, तो उन्हें ASCII में नहीं बचाया जा सकता है।

1
@ स्पेसर: कोई भी ASCII स्ट्रिंग UTF-8 स्ट्रिंग है , इसलिए इसमें कोई अंतर नहीं है । आपके द्वारा उपयोग किए जाने वाले प्लेटफ़ॉर्म के स्ट्रिंग प्रतिनिधित्व के आधार पर एन्कोडिंग दिनचर्या तेज हो सकती है, हालांकि मुझे लचीलेपन में महत्वपूर्ण नुकसान होने की उम्मीद है, जबकि मैं महत्वपूर्ण स्पीडअप की उम्मीद नहीं करता।
बैकऑडोस

@ यही कारण है कि मैं पूछ रहा हूँ कि क्या ASCII के रूप में बचत करने से कोई फायदा है
Pacerier

5
@Pacerier, यदि आप XML को ASCII के रूप में सहेजते हैं, तो आपको उदाहरण के लिए & # 160 का उपयोग करना होगा; एक न टूटने वाले स्थान के लिए। यह अधिक भरना है, लेकिन आपके डेटा को आईएसओ-लैटिन -1 बनाम यूटीएफ -8 एन्कोडिंग त्रुटियों के खिलाफ अधिक प्रतिरोधी बनाता है। यह वही है जो हम करते हैं क्योंकि हमारा अंतर्निहित मंच पात्रों के साथ बहुत सारे अदृश्य जादू करता है। ASCII में बने रहने से हमारा डेटा और अधिक मजबूत होता है।

3

हां, अभी भी कुछ उपयोग के मामले हैं जहां ASCII समझ में आता है: फ़ाइल प्रारूप और नेटवर्क प्रोटोकॉल । विशेष रूप से, जहां उपयोग के लिए:

  • आपके पास डेटा है जो कंप्यूटर प्रोग्राम द्वारा उत्पन्न और उपभोग किया जाता है, कभी भी उपयोगकर्ताओं को प्रस्तुत नहीं किया जाता है;
  • लेकिन यह प्रोग्रामर के लिए उपयोगी होने के साथ-साथ विकास और डिबगिंग में आसानी के लिए उपयोगी है।

अपने एन्कोडिंग के रूप में ASCII का उपयोग करके आप कम से कम कुछ मानव-पठनीयता को बनाए रखते हुए मल्टी-बाइट एन्कोडिंग की जटिलता से बचते हैं।

कुछ उदाहरण:

  • HTTP एक नेटवर्क प्रोटोकॉल है जिसे ऑक्टेट्स के अनुक्रमों के संदर्भ में परिभाषित किया गया है, लेकिन यह बहुत उपयोगी है (कम से कम अंग्रेजी बोलने वाले प्रोग्रामर के लिए) जो कि "GET", "POST", "स्वीकार-भाषा" और जैसे शब्दों के ASCII एन्कोडिंग के अनुरूप हैं जल्द ही।
  • PNG छवि प्रारूप में हिस्सा प्रकार चार ऑक्टेट से मिलकर बनता है, लेकिन यह काम आप एक PNG एनकोडर या डिकोडर कि प्रोग्रामिंग कर रहे हैं है IDAT"छवि डेटा" का अर्थ है, और PLTE"पैलेट" का अर्थ है।

बेशक आपको सावधान रहने की ज़रूरत है कि डेटा वास्तव में उपयोगकर्ताओं को प्रस्तुत करने वाला नहीं है , क्योंकि यदि यह समाप्त हो रहा है (जैसा कि URL के मामले में हुआ है) दिखाई दे रहा है, तो उपयोगकर्ता सही तरीके से उस डेटा के होने की उम्मीद करने जा रहे हैं एक भाषा में वे पढ़ सकते हैं।


ख़ूब कहा है। यह थोड़ा विडंबना है कि HTTP, प्रोटोकॉल जो ग्रह पर सबसे अधिक यूनिकोड को प्रसारित करता है, उसे केवल ASCII का समर्थन करने की आवश्यकता है। (वास्तव में, मुझे लगता है कि वही टीसीपी और आईपी के लिए चला जाता है, बाइनरी सपोर्ट, एएससीआईआई सपोर्ट ... यही सब आपको स्टैक के स्तर पर चाहिए)
एरोब्रब

2

सबसे पहले: आपका शीर्षक ANSI का उपयोग करता है, जबकि आप ASCII को संदर्भित करते हैं। कृपया ध्यान दें कि ANSI ASCII के बराबर नहीं है। ANSI ASCII सेट को शामिल करता है। लेकिन एएससीआईआई सेट पहले 128 संख्यात्मक मूल्यों (0 - 127) तक सीमित है।

यदि आपका सारा डेटा ASCII (7-बिट) तक ही सीमित है, तो इससे कोई फर्क नहीं पड़ता कि आप UTF-8, ANSI या ASCII का उपयोग करते हैं, क्योंकि ANSI और UTF-8 दोनों पूर्ण ASCII सेट को अनियंत्रित करते हैं। दूसरे शब्दों में: संख्यात्मक मान 0 अप करने के लिए और 127 सहित ASCII, ANSI और UTF-8 में बिल्कुल समान वर्णों का प्रतिनिधित्व करते हैं।

यदि आपको ASCII सेट के बाहर वर्णों की आवश्यकता है, तो आपको एन्कोडिंग चुनने की आवश्यकता होगी। आप एएनएसआई का उपयोग कर सकते हैं, लेकिन फिर आप सभी विभिन्न कोड पृष्ठों की समस्याओं में भाग लेते हैं। मशीन A पर फ़ाइल बनाएँ और इसे मशीन B पर पढ़ें / मज़ेदार दिखने वाले ग्रंथों का उत्पादन करेंगे यदि इन मशीनों को अलग-अलग कोड पृष्ठों का उपयोग करने के लिए सेट किया जाता है, तो सरल क्योंकि संख्यात्मक मान nnn इन कोड पृष्ठों में भिन्न वर्णों का प्रतिनिधित्व करता है।

यह "कोड पृष्ठ नरक" यही कारण है कि यूनिकोड मानक को परिभाषित किया गया था। UTF-8 लेकिन उस मानक का एक एकल एन्कोडिंग है, और भी कई हैं। UTF-16 सबसे अधिक व्यापक रूप से इस्तेमाल किया जा रहा है क्योंकि यह विंडोज के लिए देशी एन्कोडिंग है।

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


अगर मुझे 128 वर्णों से आगे का समर्थन करने की आवश्यकता नहीं है, तो UTF8 एन्कोडिंग पर ACSII एन्कोडिंग चुनने का क्या फायदा है?
पचेरियर

अपने आप को उन 128 वर्णों तक सीमित करने के अलावा? बहुत ज्यादा नहीं। UTF-8 को विशेष रूप से ASCII और अधिकांश पश्चिमी भाषाओं के लिए डिज़ाइन किया गया था जिन्हें "केवल" ANSI की आवश्यकता थी। आप पाएंगे कि UTF-8 एक से अधिक बाइट के साथ उच्च ANSI वर्णों की केवल अपेक्षाकृत कम संख्या को कूटबद्ध करेगा। एक कारण यह है कि अधिकांश HTML पृष्ठ डिफ़ॉल्ट के रूप में UTF-8 का उपयोग करते हैं ...
मार्जन वेनमा

1
@Pacerier, अगर आपको 127 से ऊपर एन्कोडिंग की आवश्यकता नहीं है, तो ASCII चुनने के लायक हो सकता है जब आप कुछ API का उपयोग एनकोड / डीकोड करने के लिए करते हैं, क्योंकि UTF को अतिरिक्त बाइट को एक ही वर्ण के रूप में अतिरिक्त बाइट्स पर विचार करने के लिए अतिरिक्त बिट सत्यापन की आवश्यकता होती है, इसके बजाए अतिरिक्त कम्प्यूटिंग ले सकते हैं शुद्ध ASCII जो सत्यापन के बिना सिर्फ 8 बिट्स पढ़ता है। लेकिन मैं केवल आपको ASCII का उपयोग करने की सलाह देता हूं यदि आपको वास्तव में बड़े (बड़े बड़े) अभिकलन में उच्च स्तर के अनुकूलन की आवश्यकता है और आपको पता है कि आप उस अनुकूलन में क्या कर रहे हैं। यदि नहीं, तो बस यूटीएफ -8 का उपयोग करें।
लुसियानो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.