Base64 और UTF-8: चीनी पाठ, इमोजी और प्रतिस्थापन वर्णों का निदान करें

यूनिकोड और UTF-8 बाइट्स के माध्यम से टेक्स्ट को ट्रेस करें, डिकोडिंग त्रुटियों को सामान्यीकरण से अलग करें, और अमान्य बाइनरी इनपुट को संरक्षित करें।

जब Base64 "चीनी को तोड़ता हुआ" प्रतीत होता है, तो समस्या आमतौर पर वर्णों और बाइट्स के बीच की सीमा होती है। Base64 को नहीं पता कि कोई अनुक्रम चीनी पाठ या इमोजी का प्रतिनिधित्व करता है। यह बाइट्स को सुरक्षित रखता है; एप्लिकेशन चुनता है कि उन बाइट्स का उत्पादन और व्याख्या कैसे की जाए।

बाइट्स का पालन करें

अक्षर 中 U+4E2D है। UTF-8 में यह बाइट्स E4 B8 AD का उपयोग करता है, जिसका Base64 प्रतिनिधित्व है 5Lit. एक अलग वर्ण एन्कोडिंग अलग-अलग बाइट्स उत्पन्न करती है और इसलिए एक अलग Base64 मान होता है। एन्कोडेड स्ट्रिंग्स की तुलना करने से पहले दोनों सिरों पर UTF-8 पर सहमत हों।

const bytes = new TextEncoder().encode('中');
console.log([...bytes]); // [228, 184, 173]
console.log([...bytes].map(b => b.toString(16)).join(' ')); // e4 b8 ad

इमोजी एक और अंतर बताते हैं: JavaScript '😊'.length दो UTF-16 कोड इकाइयाँ हैं, जबकि इसके UTF-8 प्रतिनिधित्व में चार बाइट्स हैं। कोई भी संख्या अकेले मनमाने पाठ में दृश्यमान उपयोगकर्ता-कथित वर्णों की गिनती नहीं है। फ़ाइल और परिवहन गणना के लिए बाइट लंबाई का उपयोग करें।

प्रतिस्थापन को दृश्यमान बनाएं

प्रतिस्थापन वर्ण - का अर्थ यह हो सकता है कि पहले वाला डिकोडर पहले ही जानकारी खो चुका है। एक बार जब अज्ञात बाइट्स को एक स्ट्रिंग में बदल दिया जाता है और उस स्ट्रिंग को फिर से एन्कोड किया जाता है, तो मूल मानों को आम तौर पर पुनर्निर्माण नहीं किया जा सकता है। आगे रूपांतरण करने से पहले कच्चे डिकोडेड बाइट सरणी का निरीक्षण करें।

const decoder = new TextDecoder('utf-8', { fatal: true });
console.log(decoder.decode(Uint8Array.of(0xe4, 0xb8, 0xad))); // 中
try { decoder.decode(Uint8Array.of(0xff)); }
catch { console.log('Invalid UTF-8; preserve the original byte.'); }

सामान्यीकरण एक अलग ऑपरेशन है

अलग-अलग यूनिकोड अनुक्रमों वाले दो तार समान दिख सकते हैं। उच्चारण वाला अक्षर é एक पूर्वनिर्मित वर्ण हो सकता है या एक e जिसके बाद एक संयुक्त उच्चारण हो सकता है। UTF-8 और Base64 उस अंतर को सही ढंग से संरक्षित करते हैं। यदि आपका एप्लिकेशन सामान्यीकृत पाठ चाहता है, तो स्पष्ट रूप से एक सामान्यीकरण फॉर्म चुनें और एन्कोडिंग से पहले इसे लागू करें; बदले हुए परिणाम को कभी भी बाइट-संरक्षण मरम्मत न कहें।

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

एक विश्वसनीय समस्या निवारण क्रम है: स्रोत को संरक्षित करना, बाइट्स का निरीक्षण करना, अपेक्षित वर्ण एन्कोडिंग की पहचान करना, स्पष्ट त्रुटि प्रबंधन के साथ डिकोड करना और उसके बाद ही सामान्यीकरण पर विचार करना। एमडीएन: btoa() बताता है कि सीधे ब्राउज़र बीटीओए कॉल मनमाने ढंग से यूनिकोड टेक्स्ट के लिए अनुपयुक्त क्यों हैं। बाइनरी फ़ाइलों को टेक्स्ट डिकोडिंग को पूरी तरह से बायपास करना चाहिए।