सभी लेख

स्ट्रिंग एस्केपिंग: JS, JSON, शेल और रेगेक्स में अलग-अलग नियम क्यों

देवनागरी में कई अक्षर असल में कई यूनिकोड कोड-पॉइंट्स से मिलकर बनते हैं — जैसे "कि" एक व्यंजन और एक मात्रा (matra) के संयोजन से बनता है। इसका मतलब यह है कि जब \uXXXX यूनिकोड एस्केपिंग चालू की जाती है, तो एक ही दिखने वाला अक्षर कई \uXXXX सीक्वेंस में टूट सकता है, न कि हमेशा एक ही सीक्वेंस में — जो लैटिन या यहाँ तक कि हान लिपि के मुकाबले काफ़ी अलग व्यवहार है।

JavaScript/JSON स्ट्रिंग में एस्केपिंग

JS और JSON स्ट्रिंग लिटरल में, स्पेशल कैरेक्टर बैकस्लैश से एस्केप होते हैं: कोट के लिए \", नई लाइन के लिए \n, बैकस्लैश के लिए ही \\। JSON को भी ज़रूरी है कि सभी स्ट्रिंग डबल कोट का इस्तेमाल करें — JS के उलट, जहाँ सिंगल कोट भी मान्य है।

शेल कमांड में एस्केपिंग

कमांड लाइन पर, स्पेशल कैरेक्टर में स्पेस, कोट, डॉलर साइन, स्टार, और अन्य शामिल हैं — इन सबका शेल के लिए ख़ास मतलब है। किसी कमांड आर्ग्युमेंट में स्पेस को या तो एस्केप करना पड़ता है या पूरे आर्ग्युमेंट को कोट में लपेटना पड़ता है, वरना शेल इसे दो अलग आर्ग्युमेंट में बाँट देगा।

रेगुलर एक्सप्रेशन में एस्केपिंग

रेगुलर एक्सप्रेशन में, डॉट, स्टार या ब्रैकेट जैसे कैरेक्टर का ख़ास मतलब होता है (कोई भी कैरेक्टर, एक क्वांटिफ़ायर, एक ग्रुप)। इन्हें मेटाकैरेक्टर के बजाय शाब्दिक रूप से ढूँढने के लिए, इनके आगे बैकस्लैश लगाया जाता है: \. एक शाब्दिक डॉट ढूँढता है, "कोई भी कैरेक्टर" नहीं।

हर संदर्भ को अपनी एस्केपिंग की ज़रूरत क्यों है

"डबल एस्केपिंग" या "कम एस्केपिंग" की गलती यूज़र टेक्स्ट (जैसे स्पेस वाला फ़ाइल पथ) को किसी कमांड या स्ट्रिंग में डालते समय कोड टूटने की सबसे आम वजहों में से एक है। सही एस्केपिंग इस बात पर निर्भर करती है कि टेक्स्ट ठीक कहाँ डाला जा रहा है, टेक्स्ट पर नहीं।

यह किस काम आता है

  • देवनागरी सहित यूज़र टेक्स्ट को JSON रिक्वेस्ट में सुरक्षित इंसर्शन के लिए तैयार करना।
  • कमांड इंजेक्शन के जोखिम के बिना डायनामिक आर्ग्युमेंट वाले शेल कमांड बनाना।
  • टेक्स्ट को रेगुलर एक्सप्रेशन में शाब्दिक पैटर्न के रूप में इस्तेमाल करने से पहले स्पेशल कैरेक्टर एस्केप करना।

नेस्टेड संदर्भों में डबल एस्केपिंग

अगर टेक्स्ट लगातार दो संदर्भों से होकर गुज़रता है — जैसे कोई स्ट्रिंग JSON में डाली जाती है, और वह JSON ख़ुद किसी शेल कमांड के आर्ग्युमेंट के रूप में पास की जाती है — तो एस्केपिंग सही क्रम में करनी होगी: पहले भीतरी संदर्भ (JSON) के लिए, फिर बाहरी (shell) के लिए। क्रम गड़बड़ होना या किसी एक लेवल को छोड़ देना, यही सबसे आम वजह है कि "सही ढंग से एस्केप की गई" स्ट्रिंग व्यवहार में फिर भी टूट जाती है।

टूल आज़माएँ