कब प्लस (+) या% 20 के लिए अंतरिक्ष सांकेतिक शब्दों में बदलना?


487

कभी-कभी रिक्त स्थान URL को +साइन इन करने के लिए एन्कोडेड हो जाते हैं, कुछ समय के लिए %20। क्या अंतर है और ऐसा क्यों होना चाहिए?


जवाबों:


481

+केवलapplication/x-www-form-urlencoded सामग्री में स्थान का अर्थ है, जैसे कि URL का क्वेरी भाग:

http://www.example.com/path/foo+bar/path?query+name=query+value

इस URL में, पैरामीटर नाम है query nameएक स्थान के साथ और मूल्य है query valueएक स्थान के साथ है, लेकिन रास्ते में फ़ोल्डर नाम का शाब्दिक है foo+bar, नहीं foo bar

%20इन संदर्भों में से किसी एक स्थान को एन्कोड करने का एक वैध तरीका है। इसलिए अगर आपको URL के भाग में शामिल करने के लिए एक स्ट्रिंग-URL को एनकोड करना है, तो हमेशा रिक्त स्थान को %20और pluses के साथ बदलना सुरक्षित है %2B। यह वह है जैसे। encodeURIComponent()जावास्क्रिप्ट में करता है। दुर्भाग्य से यह नहीं है कि PHP में urlencode क्या करता है ( rawurlencode अधिक सुरक्षित है)।

इसके अलावा HTML 4.01 विनिर्देश आवेदन / x-www-form-urlencoded देखें


5
वास्तव में मैं उलझन में हूं, मेरा प्रश्न यह है कि जब ब्राउज़र पहला फ़ॉर्म करता है, और दूसरा फ़ोमर कब करता है?
मुहम्मद Hewedy

11
ब्राउज़र query+name=query+valueएक फॉर्म से एक पैरामीटर बनाएगा <input name="query name" value="query value">। यह query%20nameएक फॉर्म से नहीं बनेगा , लेकिन इसके बजाय इसका उपयोग करना पूरी तरह से सुरक्षित है, जैसे। यदि आप एक फॉर्म जमा कर रहे हैं तो आप स्वयं के लिए XMLHttpRequest। यदि आपके पास इसमें जगह के साथ एक URL है, जैसे <a href="http://www.example.com/foo bar/">, तो ब्राउज़र %20आपको अपनी गलती को ठीक करने के लिए एन्कोड करेगा , लेकिन यह शायद सबसे अच्छा पर निर्भर नहीं है।
बोबिन्स

6
जावास्क्रिप्ट मेकअप पर क्या समारोह foo barके लिए foo+bar?
सिसिर

21
@ शिशिर: कोई जेएस फ़ंक्शन नहीं है जो URL-फ़ॉर्म-एन्कोडिंग करेगा। आप स्वाभाविक रूप से कर सकते हैं encodeURIComponent(s).replace(/%20/g, '+')अगर आपको वास्तव में जरूरत है+
बॉब

2
यह एक बहुत ही भ्रामक उदाहरण है, जो फॉर्म-यूरेलेंकोडेड है। इसका URL से कोई लेना देना नहीं है।
डेव वान डेन आईंड

54

http://www.example.com/some/path/to/resource?param1=value1

प्रश्न चिह्न से पहले का हिस्सा% एन्कोडिंग (इसलिए %20स्थान के लिए) का उपयोग करना चाहिए , प्रश्न चिह्न के बाद आप %20या तो +अंतरिक्ष के लिए उपयोग कर सकते हैं । यदि आपको +प्रश्न चिह्न के उपयोग के बाद वास्तविक की आवश्यकता है %2B


6
@DaveVandenEynde क्यों नहीं?
सेर्बेरोस

10
क्योंकि यह गलत है। यह पुराने एप्लिकेशन / x-www-form-urlencoded मीडिया प्रकार का हिस्सा है जो URL पर लागू नहीं होता है। इसके अलावा, decodeURIComponentयह डिकोड नहीं करता है।
डेव वान डेन आईंड

3
हाँ, यह शायद RFC 1630 से कॉपी किया गया है और कभी भी एक मानक नहीं था। tools.ietf.org/html/rfc3986 मानक (IPv6 या कुछ के लिए फिर से अपडेट किया गया) है। निश्चित ब्राउज़र अभी भी इसे "सपोर्ट" करते हैं लेकिन इसका क्या मतलब है? यह या तो सर्वर या क्लाइंट कोड है जो क्वेरी स्ट्रिंग को पढ़ता है और इसे डिकोड करता है, ब्राउज़र नहीं। ब्राउज़र बस इसे आगे और पीछे से गुजरता है, और चूंकि +एक आरक्षित चरित्र है, यह ब्राउज़र द्वारा संरक्षित किया जाएगा।
डेव वान ने आईंड

18
Google खोज स्थानों के लिए url ( google.com/#q=perl+equivalent+to+php+urlencode+spaces+as+%2B ) का उपयोग करता है।
जस्टिन

2
जानकारी के लिए: भी साथ में रिक्त स्थान डीकोड रेल +डिफ़ॉल्ट रूप से ( { foo: 'bar bar'}.to_query=> foo=bar+bar)
wrtsprt

46

तो, यहाँ उत्तर सभी थोड़े अधूरे हैं। URL में किसी स्थान को एनकोड करने के लिए '% 20' के उपयोग को RFC3986 में स्पष्ट रूप से परिभाषित किया गया है , जो परिभाषित करता है कि एक URI कैसे बनाया जाता है। एन्कोडिंग रिक्त स्थान के लिए '+' का उपयोग करने के इस विनिर्देश में कोई उल्लेख नहीं है - यदि आप इस विनिर्देश द्वारा पूरी तरह से चलते हैं, तो एक स्थान को '% 20' के रूप में एन्कोड किया जाना चाहिए।

एन्कोडिंग रिक्त स्थान के लिए '+' का उपयोग करने का उल्लेख HTML विनिर्देश के विभिन्न अवतारों से आता है - विशेष रूप से सामग्री प्रकार 'आवेदन / x-www-form-urlencoded' अनुभाग में। इसका उपयोग फॉर्म डेटा पोस्ट करने के लिए किया जाता है।

अब, HTML 2.0 विनिर्देश (RFC1866) ने स्पष्ट रूप से खंड 8.2.2 में कहा है, कि GET अनुरोध के URL स्ट्रिंग के क्वेरी भाग को 'एप्लिकेशन / x-www-form-urlencoded' के रूप में एन्कोड किया जाना चाहिए। यह, सिद्धांत में, यह सुझाव देता है कि क्वेरी स्ट्रिंग ('?') के बाद URL में '+' का उपयोग करना कानूनी है।

लेकिन ... क्या यह वास्तव में है? याद रखें, HTML स्वयं एक सामग्री विनिर्देश है, और क्वेरी के साथ URL का उपयोग HTML के अलावा अन्य सामग्री के साथ किया जा सकता है। इसके अलावा, जब HTML संस्करण के बाद के संस्करण '+' को 'एप्लीकेशन / x-www-form-urlencoded' सामग्री में कानूनी के रूप में परिभाषित करना जारी रखते हैं, तो वे पूरी तरह से यह कहते हुए भाग छोड़ देते हैं कि GET अनुरोध क्वेरी स्ट्रिंग्स को उस प्रकार के रूप में परिभाषित किया गया है। वास्तव में, HTML 2.0 कल्पना के बाद किसी भी चीज़ में क्वेरी स्ट्रिंग एन्कोडिंग के बारे में कोई उल्लेख नहीं है।

जो हमें प्रश्न के साथ छोड़ देता है - क्या यह वैध है? निश्चित रूप से विरासत कोड का एक बहुत कुछ है जो क्वेरी तार में '+' का समर्थन करता है, और बहुत सारे कोड जो इसे भी उत्पन्न करता है। यदि आप '+' का उपयोग करते हैं तो ऑड्स अच्छा है, आप नहीं टूटेंगे। (और, वास्तव में, मैंने हाल ही में इस पर सभी शोध किए क्योंकि मैंने एक प्रमुख साइट की खोज की जो एक अंतरिक्ष के रूप में जीईटी क्वेरी में '% 20' को स्वीकार करने में विफल रही। वे वास्तव में किसी भी प्रतिशत एन्कोडेड वर्ण को डिकोड करने में विफल रहे। इसलिए सेवा। 'का उपयोग करना प्रासंगिक भी हो सकता है।'

लेकिन विनिर्देशों के एक शुद्ध पढ़ने से, बाद में संस्करणों में HTML 2.0 विनिर्देश से भाषा के बिना, URL पूरी तरह से RFC3986 द्वारा कवर किए गए हैं, जिसका अर्थ है कि रिक्त स्थान को '% 20' में परिवर्तित किया जाना चाहिए। और निश्चित रूप से यह मामला होना चाहिए अगर आप एक HTML दस्तावेज़ के अलावा कुछ भी अनुरोध कर रहे हैं।


अपने उत्तर में जोड़ने के लिए, डिफ़ॉल्ट रूप से क्रोम URL में रिक्त स्थान को एन्कोड करता है %20( <a href="?q=a b">), लेकिन जब आप एक फॉर्म भेजते हैं, तो यह +साइन का उपयोग करता है । आप +साइन का उपयोग करके स्पष्ट रूप से ( <a href="?q=a+b">), या उपयोग करके फ़ॉर्म भेजकर ओवरराइड कर सकते हैं XMLHTTPRequest
एक्स-यूरी

URLSearchParams Developers.google.com/web/updates/2016/01/urlsearchparams को जोड़ने के उद्देश्य को समझना वास्तव में कठिन है , जो कुछ विरासत तरीके से काम करता है (SPACE को '+' में क्रमबद्ध करें)। यह IE11 में भी समर्थित नहीं है!
निम्फेटामाइन

9

इसकी जगह हमेशा% 20 के रूप में रिक्त स्थान को एनकोड करती है, "+" के रूप में नहीं।

यह RFC-1866 (HTML 2.0 विनिर्देशन) था, जो निर्दिष्ट करता था कि अंतरिक्ष वर्णों को "+" के रूप में "एप्लिकेशन / x-www-form-urlencoded" सामग्री-प्रकार की-वैल्यू जोड़े में एन्कोड किया जाना चाहिए। (पैरा 8.2.1 देखें। सबपर पैरा 1.)। प्रपत्र डेटा एन्कोडिंग का यह तरीका बाद के HTML विनिर्देशों में भी दिया गया है, एप्लिकेशन / x-www-form-urlencoded के बारे में प्रासंगिक पैराग्राफ देखें।

यहां URL में ऐसी स्ट्रिंग का एक उदाहरण है जहां RFC-1866 प्लस के रूप में एन्कोडिंग रिक्त स्थान की अनुमति देता है: "http://example.com/over/there?name=foo+bar"। तो, केवल "?" के बाद, रिक्त स्थान को RFC-1866 के अनुसार, प्लसस द्वारा प्रतिस्थापित किया जा सकता है। अन्य मामलों में, रिक्त स्थान को 20% तक एन्कोड किया जाना चाहिए। लेकिन चूंकि यह संदर्भ निर्धारित करना कठिन है, इसलिए रिक्त स्थान को कभी भी "+" के रूप में एनकोड करना सबसे अच्छा अभ्यास है।

मैं RFC-3986, p.2.3 में परिभाषित "अनारक्षित" को छोड़कर सभी वर्णों को प्रतिशत-सांकेतिक शब्दों में बदलना चाहूंगा

unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"

1
में .Net फ्रेमवर्क UrlEncode QueryString में '+' का उपयोग करता है, लेकिन आधुनिक में .Net कोर% 20 का उपयोग किया जाता है
माइकल फ्रीजिम

@ MiFreidgeimSO-stopbeingevil हमें बताने के लिए धन्यवाद। ऐसा लगता है कि आधुनिक .Net कोर ने अधिक सुसंगत और संगत होने का फैसला किया है।
मैक्सिम मासियूटिन

2

क्या अंतर है: अन्य उत्तर देखें।

+इसके बजाय कब उपयोग करें %20? उपयोग करें +, यदि किसी कारण से, आप URL क्वेरी स्ट्रिंग ( ?.....) या हैश टुकड़ा ( #....) को अधिक पठनीय बनाना चाहते हैं। उदाहरण: आप वास्तव में इसे पढ़ सकते हैं:

https://www.google.se/#q=google+doesn%27t+encode+:+and+uses+%2B+instead+of+spaces ( %2B= +)

लेकिन पढ़ने के लिए निम्नलिखित बहुत कठिन है: (कम से कम मेरे लिए)

https://www.google.se/#q=google%20doesn%27t%20oops%20:%20%20this%20text%20%2B%20is%20different%20spaces

मुझे लगता +है कि कुछ भी टूटने की संभावना नहीं है, क्योंकि Google उपयोग करता है +(ऊपर दिए गए लिंक को देखें) और उन्होंने शायद इस बारे में सोचा है। मैं +खुद को सिर्फ इसलिए इस्तेमाल करने जा रहा हूं क्योंकि पठनीय + Google को लगता है कि यह ठीक है।


7
मैं कहता हूं कि "पठनीयता" तर्क '+' के लिए सबसे अच्छा बचाव है। "Google इसे करता है" तर्क बहुत ही
भयानक है ।wikipedia.org/

2
@FlipMcF गिरता हुआ तर्क-से-प्राधिकरण विकिपीडिया पृष्ठ "के बारे में है" जब किसी प्राधिकारी को किसी विषय पर विशेषज्ञता के क्षेत्र से बाहर उद्धृत किया जाता है या जब प्राधिकरण का हवाला देते हुए एक सच्चे विशेषज्ञ नहीं है " - मुझे लगता है, हालांकि, कंप्यूटर, HTTP और URL एन्कोडिंग Google के विशेषज्ञता के क्षेत्र के भीतर सामान है ।
काजमग्नस

3
@FlipMcF Google के व्यवहार का हवाला देते हुए, इस मामले में, URL में "+" का उपयोग करने के लिए एक वैध तर्क है। ऐसा नहीं है कि Google एक प्राधिकरण है, लेकिन यह कि Google संभवतः सबसे बड़ी इंटरनेट कंपनी है और यदि वे किसी तरह से कुछ करते हैं, तो यह बहुत कम संभावना है कि ब्राउज़र एक दिन उस अभ्यास का समर्थन करना बंद करने का फैसला करेगा। इसके अलावा, google chrome सबसे अधिक शेयर वाले ब्राउज़र में से एक है, और वे उस चीज़ का समर्थन करेंगे जो Google चाहता है। सब सब में, मैं कहूंगा कि "% 20" के बजाय "+" का उपयोग करने वाला कोई भी व्यक्ति भविष्य के लिए भविष्य के लिए कठिन समय नहीं होगा।
जडफ्रीरा

मैं इस तर्क को कहीं और जारी रखना पसंद करूंगा, जहां प्राधिकरण की अपील को स्वीकार करने से इनकार करने के लिए लोकप्रियता की अपील है। कम से कम हम सभी एक बात पर सहमत हो सकते हैं: '+' '% 20' से बेहतर है
FlipMcF

1
वास्तव में% 20 वाला URL पढ़ना बहुत आसान है क्योंकि (डेस्कटॉप) ब्राउज़र लिंक पर माउस कर्सर ले जाने पर विंडो के निचले भाग में डिकोड्ड URL दिखाते हैं। साथ ही संकेत अपरिवर्तित प्रदर्शित किए जाते हैं।
मार्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.