2010-04-20 7 views
364

कभी कभी रिक्त स्थान + हस्ताक्षर, %20 करने के लिए कुछ अन्य समय के लिए इनकोडिंग यूआरएल मिलता है। क्या अंतर है और ऐसा क्यों होना चाहिए?प्लस (+) या% 20 में स्थान को एन्कोड करने के लिए कब?

+6

के संभावित डुप्लिकेट [अंतरिक्ष चरित्र एन्कोडिंग यूआरएल: + या% 20?] (Http://stackoverflow.com/questions/1634271/url-encoding-the-space-character-or-20) –

उत्तर

368

+ जैसे कि URL की क्वेरी भाग के रूप में केवलapplication/x-www-form-urlencoded सामग्री में एक अंतरिक्ष मतलब है,:

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

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

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

इसके अलावा HTML 4.01 Specification application/x-www-form-urlencoded

+4

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

+7

ब्राउज़र ' 'के साथ किसी फ़ॉर्म से' query + name = query + value' पैरामीटर बना देगा। यह किसी फॉर्म से 'query% 20name' नहीं बनाएगा, लेकिन इसके बजाय इसका उपयोग करना पूरी तरह से सुरक्षित है, उदाहरण के लिए। यदि आप स्वयं को 'XMLHttpRequest' के लिए एक फॉर्म सबमिशन डाल रहे हैं। यदि आपके पास उसमें एक स्थान वाला URL है, जैसे '', तो ब्राउज़र आपके लिए ठीक करने के लिए '% 20' को एन्कोड करेगा आपकी गलती, लेकिन शायद यह सबसे अच्छा भरोसा नहीं है। – bobince

+6

जावास्क्रिप्ट पर कौन सा फ़ंक्शन 'foo bar' को' foo + bar' 'बनाता है? – Sisir

35

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

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

+4

किसी स्थान को एन्कोड करने के लिए '+' का उपयोग न करें। –

+6

@ डेववेंडेइंडे क्यों नहीं? – cerberos

+5

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

1

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

%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 सोचता है कि यह ठीक है।

+1

मैं कहता हूं कि "पठनीयता" तर्क '+' के लिए सबसे अच्छा बचाव है। तर्क ग़लत है "गूगल यह होता है" https://en.wikipedia.org/wiki/Argument_from_authority – FlipMcF

+1

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

+0

पूरे लेख को पढ़ें, न केवल पहली पंक्ति। – FlipMcF

5

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

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

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

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

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

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

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

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

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

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

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

संबंधित मुद्दे