URL को कैसे एन्कोड और डीकोड करें
यदि आपने कभी URL में %20 देखा है जहाँ एक स्पेस होना चाहिए, या %C3%A9 जहाँ एक उच्चारण वाला अक्षर होना चाहिए, तो आपने URL एन्कोडिंग का सामना किया है। यह वेब के काम करने का एक मौलिक हिस्सा है, और इसे समझने से आपको टूटे हुए लिंक, API समस्याएं और फॉर्म सबमिशन डिबग करने में मदद मिलती है। ब्राउज़र-आधारित एन्कोडर पूरा काम स्थानीय रूप से संभालता है, आपके डेटा को सर्वर पर अपलोड किए बिना।
URL एन्कोडिंग क्या करती है
URL में केवल वर्णों का एक सीमित सेट सुरक्षित रूप से हो सकता है: अक्षर (A-Z, a-z), अंक (0-9), और कुछ विशेष वर्ण (-, _, ., ~)। बाकी सब कुछ (स्पेस, उच्चारण वाले वर्ण, इमोजी, और &, =, #, ? जैसे प्रतीक) को सुरक्षित प्रारूप में बदलना होगा।
URL एन्कोडिंग (जिसे प्रतिशत एन्कोडिंग भी कहा जाता है) असुरक्षित वर्णों को % के साथ बदलती है और उनके हेक्साडेसिमल बाइट मानों के साथ:
| वर्ण | एन्कोडेड |
|---|---|
| स्पेस | %20 |
| & | %26 |
| = | %3D |
| # | %23 |
| ? | %3F |
| / | %2F |
| @ | %40 |
| : | %3A |
| + | %2B |
| , | %2C |
| ; | %3B |
| (नई लाइन) | %0A |
| (टैब) | %09 |
आपको URL एन्कोडिंग की कब आवश्यकता होती है
- विशेष वर्णों के साथ क्वेरी पैरामीटर:
मूल्य > 100 & श्रेणी = जूतेजैसी एक खोज क्वेरी को URL में काम करने के लिए एन्कोडिंग की आवश्यकता है - URL में गैर-अंग्रेज़ी वर्ण: अन्य भाषाओं में नाम, शहर या सामग्री को एन्कोड किया जाना चाहिए
- API अनुरोध: मैन्युअल रूप से API कॉल बनाते समय, पैरामीटर मानों को अक्सर एन्कोडिंग की आवश्यकता होती है
- डिबगिंग: जब एक URL काम नहीं कर रही है, तो इसे डिकोड करने से पता चलता है कि वास्तविक मान क्या हैं
- ईमेल लिंक (mailto:): mailto लिंक में विषय पंक्तियों और बॉडी टेक्स्ट को एन्कोडिंग की आवश्यकता होती है
- OAuth रीडायरेक्ट URI: OAuth प्रदाताओं को पास किए गए redirect_uri पैरामीटर को पूरी तरह से एन्कोड किया जाना चाहिए
- वेबहुक पेलोड: Stripe या Slack जैसी सेवाओं द्वारा वितरित वेबहुक URL में क्वेरी स्ट्रिंग
- मोबाइल ऐप्स में डीप लिंक: iOS/Android ऐप्स के लिए कस्टम URL स्कीमा को सुरक्षित हैंडलिंग के लिए एन्कोडिंग की आवश्यकता होती है
- GraphQL सतत क्वेरीज़: URL पैरामीटर के रूप में जोड़ी गई हैश की गई क्वेरी को एन्कोडिंग की आवश्यकता होती है
- PostgreSQL कनेक्शन स्ट्रिंग: DATABASE_URL मानों में पासवर्ड और अन्य विशेष वर्ण
एन्कोड और डिकोड कैसे करें
- एन्कोड या डिकोड चुनें: दिशा का चयन करें। क्वेरी पैरामीटर के लिए encodeURIComponent या पूर्ण URL के लिए encodeURI चुनें।
- अपना इनपुट पेस्ट करें: टेक्स्ट या URL दर्ज करें। परिणाम तुरंत अपडेट होता है।
- आउटपुट कॉपी करें: अपने कोड, API अनुरोध या ब्राउज़र में परिणाम का उपयोग करें।
URL एन्कोडिंग का संक्षिप्त इतिहास
URL एन्कोडिंग को दिसंबर 1994 में RFC 1738 द्वारा मूल URL विनिर्देश के साथ परिभाषित किया गया था। RFC टिम बर्नर्स-ली (वेब के आविष्कारक) द्वारा IETF URI वर्किंग ग्रुप के इनपुट से लिखा गया था। मूल एन्कोडिंग योजना ASCII बाइट मानों का उपयोग करती थी: प्रत्येक आरक्षित या असुरक्षित वर्ण को % के बाद दो हेक्स अंकों के रूप में एन्कोड किया गया था।
एन्कोडिंग को कई बार अपडेट किया गया:
- RFC 1738 (1994): मूल URL विनिर्देश, केवल ASCII
- RFC 2396 (1998): अधिक कठोर सिंटैक्स, «आरक्षित» वर्णों को «गैर-आरक्षित» से अलग किया
- RFC 3986 (2005): वर्तमान URI विनिर्देश, दो एन्कोडिंग मोड (पथ बनाम क्वेरी) परिभाषित करता है, गैर-ASCII के लिए UTF-8 बाइट अनुक्रम
- WHATWG URL मानक (चल रहा): ब्राउज़र-मानक जीवित विनिर्देश, सभी आधुनिक ब्राउज़र द्वारा उपयोग किया जाता है, पीछे संगतता के लिए RFC 3986 से थोड़ा अलग नियम
सबसे बड़ा परिवर्तन RFC 3986 में UTF-8 पर स्विच था। उससे पहले, एन्कोडेड URL केवल ASCII थे, और गैर-लैटिन वर्णों को वर्कअराउंड की आवश्यकता थी (डोमेन के लिए Punycode, अंतर्राष्ट्रीय पते के लिए IDN)। आज, URL में एक उच्चारण वाला «é» %C3%A9 (इसके दो UTF-8 बाइट्स) में एन्कोड होता है, न कि Latin-1 बाइट %E9 जो पुराने सिस्टम उत्पन्न करते।
encodeURI vs encodeURIComponent vs encodeURIFull
JavaScript में सूक्ष्म रूप से अलग व्यवहार के साथ तीन एन्कोडिंग फ़ंक्शन हैं:
| फ़ंक्शन | यह क्या एन्कोड करता है | यह क्या संरक्षित करता है | इसके लिए उपयोग करें |
|---|---|---|---|
| encodeURI() | सभी असुरक्षित वर्ण | URL सिंटैक्स: : / ? & = # | पूरे URL एन्कोड करना |
| encodeURIComponent() | URL सिंटैक्स सहित सभी असुरक्षित वर्ण | केवल A-Z a-z 0-9 - _ . ~ ! * ' ( ) | क्वेरी पैरामीटर मान |
| escape() (अप्रचलित) | अधिकांश असुरक्षित वर्ण | केवल Latin-1 | उपयोग न करें |
Python में:
urllib.parse.quote()encodeURI जैसा है (/, संरक्षित करता है, लेकिन : नहीं)urllib.parse.quote_plus()encodeURIComponent जैसा है लेकिन स्पेस के लिए + का उपयोग करता हैurllib.parse.urlencode(dict)पूरी क्वेरी स्ट्रिंग को एन्कोड करता है
अन्य भाषाओं में:
| भाषा | घटक एन्कोडिंग | पूर्ण URI एन्कोडिंग |
|---|---|---|
| Java | URLEncoder.encode() (+ के आसपास चेतावनी के साथ) | URI.toASCIIString() |
| C# | Uri.EscapeDataString | Uri.EscapeUriString |
| Ruby | CGI.escape() | URI.encode_www_form_component |
| PHP | rawurlencode() | urlencode() (नोट: %2B vs +) |
| Go | url.QueryEscape() | url.PathEscape() |
| Rust | percent_encoding crate | percent_encoding crate |
सामान्य चूक
- पूरे URL को एन्कोड करना: यदि आप
https://example.com/search?q=helloको एन्कोड करते हैं, तो आपकोhttps%3A%2F%2Fexample.com%2Fsearch%3Fq%3Dhelloमिलता है जो अब काम करने वाला URL नहीं है। केवल मानों को एन्कोड करें, संरचनात्मक वर्णों को नहीं। - दोहरी एन्कोडिंग: पहले से एन्कोड की गई स्ट्रिंग को एन्कोड करने से
%2520जैसी चीज़ें उत्पन्न होती हैं (%को%25के रूप में एन्कोड किया जाता है)। यदि आपका URL गलत दिखता है, तो जांचें कि क्या कुछ दो बार एन्कोड किया जा रहा है। - स्पेस + vs %20 के रूप में:
application/x-www-form-urlencoded(फॉर्म POST बॉडी) में, स्पेस+बन जाते हैं। URL में, स्पेस%20बन जाते हैं। अधिकांश सर्वर दोनों को स्वीकार करते हैं, लेकिन कुछ कठोर पार्सर नहीं। - आरक्षित वर्णों को गलत तरीके से एन्कोड करना:
?,#,&,=का URL सिंटैक्स में विशेष अर्थ है। यदि वे एक मान में दिखाई देते हैं, तो उन्हें एन्कोड किया जाना चाहिए; यदि वे सिंटैक्स के रूप में दिखाई देते हैं, तो उन्हें नहीं होना चाहिए। - प्राप्त करने पर डिकोड करना भूलना: यदि आप एक मान एन्कोड करते हैं, भेजते हैं, फिर आपका सर्वर डिकोड किए बिना
?q=hello%20worldको शाब्दिक रूप से पढ़ता है, तो आपका एप्लिकेशनhello%20worldदेखता है न किhello world। अधिकांश फ्रेमवर्क स्वचालित रूप से डिकोड करते हैं, लेकिन कस्टम कोड में सत्यापित करें। - प्लस चिह्न भ्रम:
+पथ खंडों में एक शाब्दिक प्लस है और क्वेरी स्ट्रिंग में एक स्पेस है। अस्पष्टता से बचने के लिए क्वेरी मानों में वास्तविक प्लस चिह्न को%2Bके रूप में एन्कोड करें। - UTF-8 बनाम अन्य एन्कोडिंग: यदि आपका URL «résumé» शामिल है और सर्वर UTF-8 के बजाय Latin-1 की अपेक्षा करता है, तो आपको mojibake मिल सकता है। आधुनिक वेब UTF-8 है; विरासत सिस्टम नहीं हैं।
- URL लंबाई सीमा: भले ही विनिर्देश में कोई कठोर सीमा नहीं है, ब्राउज़र और सर्वर अक्सर URL को 2048-8192 वर्णों पर सीमित करते हैं। भारी एन्कोड किया गया डेटा अपेक्षा से तेज़ी से सीमा तक पहुंच सकता है।
- कुकीज़ और Referer हेडर: URL Referer हेडर में पास किए जाते हैं और लॉग किए जा सकते हैं। URL में संवेदनशील डेटा (पासवर्ड, टोकन) लॉग और विश्लेषण में लीक हो जाता है। संवेदनशील डेटा के लिए POST बॉडी का उपयोग करें।
- गैर-ASCII डोमेन नाम: डोमेन Punycode (RFC 3492) का उपयोग करते हैं, प्रतिशत एन्कोडिंग नहीं। «münchen.de» DNS लुकअप में «xn--mnchen-3ya.de» बन जाता है, न कि «m%C3%BCnchen.de»।
काम किए हुए उदाहरण
| इनपुट | encodeURI | encodeURIComponent |
|---|---|---|
hello world | hello%20world | hello%20world |
q=test&page=1 | q=test&page=1 | q%3Dtest%26page%3D1 |
https://x.com/path | https://x.com/path | https%3A%2F%2Fx.com%2Fpath |
caf é | caf%20%C3%A9 | caf%20%C3%A9 |
中文 | %E4%B8%AD%E6%96%87 | %E4%B8%AD%E6%96%87 |
100% | 100%25 | 100%25 |
email@test.com | email@test.com | email%40test.com |
सुझाव
- मान एन्कोड करें, पूरे URL नहीं: यदि आप पूरे URL को एन्कोड करते हैं, तो स्लैश और कोलन जो URL को संरचित करते हैं, उन्हें भी एन्कोड किया जाएगा, इसे तोड़कर। केवल क्वेरी पैरामीटर के भीतर मानों को एन्कोड करें।
- दोहरी एन्कोडिंग: पहले से एन्कोड की गई स्ट्रिंग को एन्कोड करने से
%2520जैसी चीज़ें उत्पन्न होती हैं (%को%25के रूप में एन्कोड किया जाता है)। यदि आपका URL गलत दिखता है, तो जांचें कि क्या कुछ दो बार एन्कोड किया जा रहा है। - डिबगिंग के लिए डिकोड करें: जब एक API अनुरोध विफल होता है या एक URL उलझा हुआ दिखता है, तो वास्तविक पैरामीटर मान देखने के लिए इसे डिकोड करें। यह अक्सर तुरंत समस्या प्रकट करता है।
- अपनी भाषा के अंतर्निहित फ़ंक्शन का उपयोग करें: उत्पादन कोड में, हमेशा
encodeURIComponent()(JavaScript),urllib.parse.quote()(Python), याURLEncoder.encode()(Java) का उपयोग करें न कि हाथ से एन्कोडिंग। - एज केस के साथ परीक्षण करें: स्पेस, उच्चारण, इमोजी और विशेष वर्णों के साथ इनपुट आज़माएं। यदि आपकी एन्कोडिंग उन सभी के लिए काम करती है, तो यह काम करती है।
- ब्राउज़र एड्रेस बार में सत्यापित करें: अपने एन्कोडेड URL को एक ब्राउज़र में पेस्ट करें। यदि पेज लोड होता है, तो URL अच्छी तरह से बनाया गया है। यदि नहीं, तो आपकी एन्कोडिंग में एक बग है।
- जटिल मामलों के लिए क्वेरी स्ट्रिंग लाइब्रेरी का उपयोग करें: डिक्शनरी या ऑब्जेक्ट (
?a=1&b=2&c=3) से क्वेरी स्ट्रिंग बनाना मैनुअल असेंबली की तुलना में लाइब्रेरी फ़ंक्शन (Python में urlencode, JavaScript में URLSearchParams) के साथ आसान और सुरक्षित है। - पथ और क्वेरी एन्कोडिंग के बीच अंतर जानें: पथ खंड में एक फॉरवर्ड स्लैश
/संरचनात्मक है; क्वेरी मान में, इसे एन्कोड किया जाना चाहिए। RFC 3986 में प्रत्येक के लिए अलग नियम हैं।
गोपनीयता और गोपनीय URL
URL एन्कोडर और डिकोडर पूरी तरह से आपके ब्राउज़र में चलते हैं। आप जो URL पेस्ट करते हैं, मध्यवर्ती प्रसंस्करण, और एन्कोडेड/डिकोडेड आउटपुट सभी आपके डिवाइस पर रहते हैं। कुछ भी सर्वर पर अपलोड नहीं किया जाता, लॉग नहीं किया जाता, या किसी के साथ साझा नहीं किया जाता।
यह महत्वपूर्ण है क्योंकि URL में अक्सर अत्यंत संवेदनशील डेटा होता है: क्वेरी पैरामीटर में API कुंजी और टोकन, खाता पहुंच प्रदान करने वाले OAuth प्राधिकरण कोड, सत्र ID, एम्बेडेड क्रेडेंशियल के साथ निजी S3 बकेट के लिए हस्ताक्षरित URL, मैजिक-लिंक लॉगिन टोकन, पासवर्ड रीसेट URL, उत्पाद संरचना को प्रकट करने वाले आंतरिक व्यवस्थापक URL, सदस्यता रद्द करने वाले लिंक में ग्राहक ईमेल पते, फॉर्म सबमिशन में व्यक्तिगत डेटा। क्लाउड URL एन्कोडर प्रत्येक पेस्ट को लॉग करते हैं, कभी-कभी «सेवा सुधार» के लिए उन्हें बनाए रखते हैं, और वास्तविक लीक में शामिल रहे हैं जहाँ पेस्ट किए गए प्रमाणीकरण टोकन को लॉग की निगरानी करने वाले हमलावरों द्वारा निकाला गया। ब्राउज़र-आधारित एन्कोडर में शून्य एक्सपोज़र है: URL कभी आपकी मशीन नहीं छोड़ती।
ब्राउज़र-आधारित एन्कोडिंग पृष्ठ लोड होने के बाद ऑफ़लाइन भी काम करती है, हवाई जहाज़ों पर, इंटरनेट एक्सेस के बिना सुरक्षित वातावरण में, या कहीं भी जहाँ आप किसी तृतीय पक्ष सेवा में प्रमाणीकरण-वाहक URL नहीं पेस्ट कर सकते या नहीं पेस्ट करना चाहिए, URL को एन्कोड करने के लिए उपयोगी।
अक्सर पूछे जाने वाले प्रश्न
encodeURI और encodeURIComponent में क्या अंतर है?
encodeURI URL संरचना में मान्य वर्णों को संरक्षित करता है (स्लैश, कोलन, प्रश्न चिह्न)। encodeURIComponent अक्षरों, अंकों और कुछ सुरक्षित वर्णों को छोड़कर सब कुछ एन्कोड करता है। क्वेरी पैरामीटर मानों के लिए encodeURIComponent का उपयोग करें, पूर्ण URL के लिए encodeURI।
रिक्त स्थान %20 या + क्यों बन जाते हैं?
URL एन्कोडिंग में, रिक्त स्थान %20 बन जाते हैं। फ़ॉर्म डेटा में (application/x-www-form-urlencoded), रिक्त स्थान + बन जाते हैं। दोनों अपने संदर्भों में मान्य हैं, लेकिन %20 URL के लिए सार्वभौमिक मानक है।
क्या मुझे अपनी URL को मैन्युअल रूप से एन्कोड करना चाहिए?
अधिकांश मामलों में, आपकी भाषा या फ्रेमवर्क एन्कोडिंग को स्वचालित रूप से संभालते हैं। मैन्युअल एन्कोडिंग तब उपयोगी है जब आप हाथ से URL बना रहे हों, API अनुरोध डिबग कर रहे हों या विशेष वर्णों वाली क्वेरी स्ट्रिंग्स के साथ काम कर रहे हों।
क्या मेरा डेटा किसी सर्वर पर भेजा जाता है?
नहीं। सारी एन्कोडिंग और डीकोडिंग आपके ब्राउज़र में होती है।