वेब और एन्कोडिंग
ASCII, Unicode और UTF-8 में अंतर: बाइट के उदाहरण
00–7F बाइट के लिए ASCII और UTF-8 एक ही टेक्स्ट देते हैं। अंतर तब दिखता है जब टेक्स्ट में हिंदी, सिरिलिक, उच्चारण चिह्न वाले अक्षर या इमोजी हों।
प्रकाशित
ASCII, Unicode और UTF-8 अलग बातें बताते हैं
ASCII सात-बिट का वर्ण कोड समूह है। इसे आम तौर पर ऐसे बाइट में रखा जाता है जिनका सबसे ऊपरी बिट शून्य हो। UTF-8 इन मानों को बनाए रखता है। Unicode का अर्थ केवल UTF-8 नहीं है: उसी कोड पॉइंट को UTF-16 या UTF-32 में भी लिखा जा सकता है।
| नाम | क्या बताता है | उदाहरण |
|---|---|---|
| ASCII | नियंत्रण कोड सहित 128 वर्ण कोड | A = दशमलव 65 = हेक्स 41 |
| Unicode | अलग लिपियों के टेक्स्ट के लिए कोड पॉइंट | क = U+0915 |
| UTF-8 | Unicode स्केलर मानों की बाइट एन्कोडिंग | क = E0 A4 95 |
वही ASCII बाइट UTF-8 में भी काम करते हैं
इस उदाहरण का हर बाइट हेक्स 80 से छोटा है। ASCII या UTF-8 में डिकोड करने पर Hello मिलता है। यह संगतता 0A जैसे लाइन फ़ीड नियंत्रण कोड पर भी लागू होती है; इसका अर्थ यह नहीं कि हर बाइट छपने वाला वर्ण है।
48 65 6C 6C 6F
Hello| टेक्स्ट | कोड पॉइंट | UTF-8 बाइट | ASCII में? |
|---|---|---|---|
| A | U+0041 | 41 | हाँ |
| é | U+00E9 | C3 A9 | नहीं |
| Я | U+042F | D0 AF | नहीं |
| क | U+0915 | E0 A4 95 | नहीं |
| 😀 | U+1F600 | F0 9F 98 80 | नहीं |
हिंदी और दूसरे गैर-ASCII वर्ण कई बाइट लेते हैं
यहाँ Я दो बाइट, स्पेस एक बाइट और क तीन बाइट लेता है। हर बाइट को अलग वर्ण मानने पर UTF-8 की संरचना खो जाती है। नीचे उदाहरण को ASCII और UTF-8 के बीच बदलकर अंतर देखें।
एक दिखाई देने वाला अक्षर कई Unicode कोड पॉइंट से बन सकता है। हिंदी का अक्षर-मात्रा समूह या संयुक्त इमोजी चार से अधिक बाइट ले सकता है, जबकि एक Unicode स्केलर मान अधिकतम चार UTF-8 बाइट लेता है।
D0 AF 20 E0 A4 95
Я कगैर-ASCII बाइट अपने आप वैध UTF-8 नहीं बनते
C3 के बाद 80–BF सीमा का continuation byte चाहिए। अगला बाइट 28 खुला कोष्ठक है और इस अनुक्रम को आगे नहीं बढ़ा सकता। UTF-8 दृश्य त्रुटि बताता है; replacement character मूल टेक्स्ट की बहाली नहीं, डिकोडिंग की समस्या का संकेत है।
बदलने से पहले स्रोत की एन्कोडिंग जाँचें। अकेला E9 किसी पुरानी एन्कोडिंग में é हो सकता है, लेकिन अकेले वह पूरा UTF-8 अनुक्रम नहीं है। अलग-अलग एन्कोडिंग आज़माने पर पढ़ने योग्य टेक्स्ट मिल सकता है, पर उससे सही स्रोत एन्कोडिंग सिद्ध नहीं होती।
C3 28Python में एन्कोडिंग स्पष्ट रूप से चुनें
एन्कोड करना टेक्स्ट को बाइट में बदलता है; डिकोड करना बाइट को टेक्स्ट की तरह पढ़ता है। फ़ाइल या प्रोटोकॉल की वास्तविक एन्कोडिंग चुनें। त्रुटियाँ अनदेखी करने से डेटा हट सकता है, इसलिए जाँच करते समय strict decoding रखें।
text = "Я क"
raw = text.encode("utf-8")
print(raw.hex(" ")) # d0 af 20 e0 a4 95
print(bytes.fromhex("d0 af 20 e0 a4 95").decode("utf-8"))
# bytes.fromhex("c3 28").decode("utf-8") raises UnicodeDecodeErrorExtended ASCII और UTF-16 अलग मामले हैं
Extended ASCII कई असंगत आठ-बिट एन्कोडिंग के लिए अनौपचारिक नाम है। 80–FF के लिए कोई एक सार्वभौमिक तालिका नहीं है। UTF-8 की संगतता मानक ASCII तक सीमित है।
UTF-16 भी Unicode दर्शाता है, लेकिन बाइट अलग होते हैं: A का UTF-16LE रूप 41 00 और UTF-16BE रूप 00 41 है। BOM, फ़ाइल मेटाडेटा या प्रोटोकॉल घोषणा पहचान में मदद कर सकते हैं; केवल सफल डिकोडिंग मूल फ़ॉर्मैट नहीं बताती।
बाइट अनुक्रम तीन चरणों में जाँचें
- मूल बाइट लें और स्रोत में घोषित एन्कोडिंग देखें।
- ASCII दृश्य में छपने वाले वर्ण, नियंत्रण कोड और गैर-ASCII बाइट पहचानें।
- UTF-8 चुनें, वैधता जाँचें और कॉपी करने से पहले नतीजा अपेक्षित टेक्स्ट से मिलाएँ।
अक्सर पूछे जाने वाले प्रश्न
क्या हर ASCII फ़ाइल वैध UTF-8 है?
केवल मानक ASCII बाइट 00–7F वाला अनुक्रम वैध UTF-8 है और वही वर्ण दर्शाता है। इससे फ़ाइल फ़ॉर्मैट का सिंटैक्स सही होने की गारंटी नहीं मिलती।
क्या ASCII हिंदी या रूसी लिख सकता है?
मानक ASCII में देवनागरी या सिरिलिक अक्षर नहीं हैं। UTF-8 जैसी Unicode एन्कोडिंग उपयोग करें। ASCII कोड पर अलग आकृति दिखाने वाला फ़ॉन्ट संग्रहित वर्ण को नहीं बदलता।
क्या UTF-8 हमेशा ASCII से अधिक जगह लेता है?
केवल ASCII टेक्स्ट के लिए बाइट संख्या समान रहती है। दूसरे वर्ण कई UTF-8 बाइट लेते हैं; बाइट की लंबाई और दिखाई देने वाले अक्षरों की संख्या अलग माप हैं।
उदाहरण आज़माएँ
ASCII-संगत बाइट से शुरू करें
Hello डिकोड करें और ASCII तथा UTF-8 के बीच बदलें।
48 65 6C 6C 6Fअपेक्षित परिणाम: दोनों दृश्य Hello दिखाते हैं; इनपुट में पाँच बाइट हैं।
उदाहरण आज़माएँ
सिरिलिक और देवनागरी डिकोड करें
दो-बाइट अक्षर, स्पेस और तीन-बाइट अक्षर एक UTF-8 अनुक्रम में हैं।
D0 AF 20 E0 A4 95अपेक्षित परिणाम: UTF-8 में Я क दिखता है। छह बाइट छह अलग वर्ण नहीं हैं।
उदाहरण आज़माएँ
गलत UTF-8 अनुक्रम जाँचें
28 बाइट C3 से शुरू हुए अनुक्रम को जारी नहीं रख सकता।
C3 28अपेक्षित परिणाम: UTF-8 दृश्य त्रुटि बताता है। Replacement character खोया हुआ मूल मान वापस नहीं लाता।
अपने बाइट जाँचें
ASCII और UTF-8 का नतीजा तुलना करके देखें
हेक्स बाइट चिपकाएँ, ASCII दृश्य देखें, फिर UTF-8 चुनकर अनुक्रम की वैधता जाँचें।