URL को अंतरिक्ष वर्ण एन्कोडिंग: + या% 20?


722

URL में कोई स्थान कब एन्कोड किया गया है +, और इसे कब एन्कोड किया गया है %20?


2
यह प्रश्न कई भाषा-विशिष्ट प्रश्नों के रूप में अधिक सहायक होगा, है ना?
चौकोरकंडी


3
@ आप जिस प्रश्न से लिंक करते हैं, उसे बाद में पूछा गया था, जिससे यह बना हुआ था, न कि यह।
वॉरिएंट चिंपांज़ी

जवाबों:


424

से विकिपीडिया (जोर और लिंक जोड़ा):

जब HTML प्रपत्रों में दर्ज किया गया डेटा सबमिट किया जाता है, तो फॉर्म फ़ील्ड के नाम और मान एनकोड किए जाते हैं और एक HTTP अनुरोध संदेश में सर्वर को GET या POST, या, ऐतिहासिक रूप से, ईमेल के माध्यम से भेजा जाता है। डिफ़ॉल्ट रूप से उपयोग की जाने वाली एन्कोडिंग सामान्य URI प्रतिशत-एन्कोडिंग नियमों के एक बहुत ही प्रारंभिक संस्करण पर आधारित है, जिसमें कई संशोधनों जैसे कि नईलाइन सामान्यीकरण और "% 20" के बजाय "+" के साथ रिक्त स्थान की जगह है। MIME प्रकार का डेटा एन्कोडेड इस तरह से अनुप्रयोग / x-www-form-urlencoded है, और इसे वर्तमान में HTML (और एक्सफ़ॉर्म) विनिर्देशों में परिभाषित किया गया है (अभी भी बहुत पुराने तरीके से)।

इसलिए, URL में डेटा बनाते समय वास्तविक प्रतिशत एन्कोडिंग का उपयोग %20संशोधित रूप में होता है +। तो आप सबसे अधिक संभावना केवल +एक के बाद क्वेरी स्ट्रिंग में URL में देख सकते हैं ?


2
तो + एन्कोडिंग तकनीकी रूप से मल्टीपार्ट / फॉर्म-डेटा एन्कोडिंग होगी, जबकि प्रतिशत एन्कोडिंग अनुप्रयोग / x-www-form-urlencoded है?
ई.पू.

17
@ बीसी: नहीं - multipart/form-dataमाइम एन्कोडिंग का उपयोग करता है; यूआरआई का उपयोग application/x-www-form-urlencodedकरता है +और ठीक से एन्कोड किया गया है %20
मैकडॉवेल

8
"तो आप क्वेरी स्ट्रिंग में केवल URL में + देखने के लिए सबसे अधिक संभावना है?" एक बोध है। आपको URL के पथ भाग में "+" कभी नहीं देखना चाहिए क्योंकि यह वह नहीं करेगा जो आप अपेक्षा करते हैं (स्थान)।
एडम जेंट

34
इसलिए मूल रूप से: GET सबमिशन का लक्ष्य है http://www.bing.com/search?q=hello+worldऔर नाम में जगह के साथ एक संसाधन हैhttp://camera.phor.net/cameralife/folders/2012/2012-06%20Pool%20party/
विलियम एंट्रीकेन

8
ध्यान दें कि ईमेल लिंक के लिए, आपको% 20 की आवश्यकता है और नहीं + के बाद? उदाहरण के लिए, mailto:support@example.org?subject=I%20need%20help। यदि आपने कोशिश की कि + के साथ, रिक्त स्थान के बजाय ईमेल + es के साथ खुल जाएगा।
सिग्मोरल

286

यह भ्रम इसलिए है क्योंकि URL आज भी 'टूटे हुए' हैं।

उदाहरण के लिए " http://www.google.com " लें । यह एक URL है। एक URL एक यूनिफ़ॉर्म रिसोर्स लोकेटर है और वास्तव में एक वेब पेज (ज्यादातर मामलों में) का सूचक है। 1994 में पहले विनिर्देशन के बाद से URL में वास्तव में एक बहुत अच्छी तरह से परिभाषित संरचना है।

हम " http://www.google.com " URL के बारे में विस्तृत जानकारी निकाल सकते हैं :

+---------------+-------------------+
|      Part     |      Data         |
+---------------+-------------------+
|  Scheme       | http              |
|  Host         | www.google.com    |
+---------------+-------------------+

यदि हम एक अधिक जटिल URL देखते हैं जैसे:

" https: // bob: bobby@www.lunatech.com: 8080 / फ़ाइल; पी = 1? q = 2 " तीसरा "

हम निम्नलिखित जानकारी निकाल सकते हैं:

+-------------------+---------------------+
|        Part       |       Data          |
+-------------------+---------------------+
|  Scheme           | https               |
|  User             | bob                 |
|  Password         | bobby               |
|  Host             | www.lunatech.com    |
|  Port             | 8080                |
|  Path             | /file;p=1           |
|  Path parameter   | p=1                 |
|  Query            | q=2                 |
|  Fragment         | third               |
+-------------------+---------------------+

https://bob:bobby@www.lunatech.com:8080/file;p=1?q=2#third
\___/   \_/ \___/ \______________/ \__/\_______/ \_/ \___/
  |      |    |          |          |      | \_/  |    |
Scheme User Password    Host       Port  Path |   | Fragment
        \_____________________________/       | Query
                       |               Path parameter
                   Authority

आरक्षित वर्ण प्रत्येक भाग के लिए अलग-अलग हैं।

HTTP URL के लिए, पथ के टुकड़े वाले हिस्से में एक स्थान को "% 20" (नहीं, बिल्कुल नहीं "+") को इनकोड करना होगा, जबकि पथ के टुकड़े वाले भाग में "+" वर्ण को अनएन्कोड किया जा सकता है।

अब क्वेरी भाग में, रिक्त स्थान को "+" (पीछे की संगतता के लिए: यूआरआई मानक में इसके लिए खोज करने की कोशिश नहीं की जा सकती) या "% 20" जबकि "+" वर्ण (इस अस्पष्टता के परिणामस्वरूप) ) को "% 2B" से बचना होगा।

इसका मतलब है कि "ब्लू + लाइट ब्लू" स्ट्रिंग को पथ और क्वेरी भागों में अलग-अलग एन्कोड किया जाना है:

" http://example.com/blue+light%20blue?blue%2Blight+blue "।

वहाँ से आप यह अनुमान लगा सकते हैं कि URL संरचना की एक क्रमिक जागरूकता के बिना पूरी तरह से निर्मित URL को एन्कोडिंग असंभव है।

यह करने के लिए नीचे फोड़े:

आपके पास %20पहले ?और +बाद में होना चाहिए ।

स्रोत


>> आप पहले 20% होना चाहिए? और + मूर्खतापूर्ण सवाल के लिए खेद है। मुझे पता है कि किसी तरह हैशटैग पैरामीटर "बाद?" प्रश्न चिह्न पैरामीटर। हालांकि यह किसी तरह अलग है क्योंकि "#" का उपयोग करने से पृष्ठ पुनः लोड नहीं होता है। लेकिन मैं "#" हैशटैग के बाद% 20 और + साइन का उपयोग करने की कोशिश कर रहा हूं, और यह काम नहीं कर रहा है। "#" के बाद किसका उपयोग करने की आवश्यकता है?
फिलिस्ब


क्या क्वेरी भाग में वास्तव में "आधिकारिक" मानक है? मुझे लगा कि मूल रूप से यह हिस्सा विशिष्ट है। 99.99% ऐप्स उपयोग करते हैं key1=value1&key1=value2जहां कुंजियाँ और मान जो भी नियमों encodeURIComponentका पालन करते हैं, लेकिन AFAIK क्वेरी भाग की सामग्री पूरी तरह से ऐप पर 100% है। अन्य तो यह केवल पहली बार जाता है #कोई आधिकारिक एन्कोडिंग नहीं है।
जमन

डुप्लिकेट प्रश्न के लिए एक डुप्लिकेट उत्तर! लेकिन हम्म, ठीक है, मैंने दोनों पर यूपी दिया।
व्लादिमीर वुकानैक

2
वह ASCII घटक लेबलिंग महाकाव्य है।
jsejcksn

25

मैं सिफारिश करूंगा %20

क्या आप उन्हें हार्ड-कोडिंग कर रहे हैं?

यह बहुत सारी भाषाओं के अनुरूप नहीं है, हालाँकि। अगर मैं गलत नहीं हूँ, PHP में urlencode()रिक्त स्थान के रूप में व्यवहार करता है +जबकि पायथन urlencode()उनके रूप में व्यवहार करता है %20

संपादित करें:

ऐसा लगता है कि मैं गलत हूं। पायथन की urlencode()(कम से कम 2.7.2 में) के quote_plus()बजाय का उपयोग करता है quote()और इस प्रकार रिक्त स्थान को "+" के रूप में एन्कोड करता है। ऐसा भी लगता है कि W3C की अनुशंसा यहाँ के अनुसार "+" है: http://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1

और वास्तव में, आप पायथन के अपने इश्यू ट्रैकर पर इस दिलचस्प बहस का अनुसरण कर सकते हैं कि रिक्त स्थान का उपयोग करने के लिए क्या है: http://bugs.python.org/issue13866

EDIT # 2:

मैं समझता हूं कि एन्कोडिंग का सबसे आम तरीका "" के रूप में "+" है, लेकिन सिर्फ एक नोट, यह सिर्फ मेरे लिए हो सकता है, लेकिन मुझे यह थोड़ा भ्रमित लगता है:

import urllib
print(urllib.urlencode({' ' : '+ '})

>>> '+=%2B+'

हार्डकॉकिंग नहीं। एक सौंदर्यवादी दृष्टिकोण से यह निर्धारित करने की कोशिश की जा रही है कि रिक्त स्थान वाले मेरे यूआरएल क्या दिखेंगे।
ई.पू.

नमस्ते, मैं भी भ्रमित हूं, जब उपयोगकर्ता HTML फॉर्म सबमिट करता है, तो फॉर्म कैसे अंतरिक्ष को एनकोड करता है? किस पात्र के साथ? क्या परिणाम ब्राउज़र-निर्भर है?
GMsoF

1
और URLEncoder.encode()जावा में विधि इसे भी रूपांतरित करती है +
рüффп

और फिर सवाल यह उठता है कि POST अनुरोध के शरीर में एन्कोडिंग का इलाज कैसे किया जाए: "सामग्री-प्रकार: अनुप्रयोग / x-www-form-urlencoded" जहां पैरामीटर "a = b & c = d" के रूप में हैं, " लेकिन सभी में एक URL नहीं है, बस "दस्तावेज़" का निकाय है। उन्होंने इस मुद्दे से एक वास्तविक खिलवाड़ किया, और निश्चित उत्तर खोजना मुश्किल हो गया।
fyngyrz

पर्ल्स uri_escape () उन्हें 20% मानते हैं
someuser

16

किसी URL के "एप्लिकेशन / x-www-form-urlencoded" सामग्री-प्रकार की-वैल्यू जोड़े क्वेरी भाग में केवल एक स्थान "+" को एन्कोड किया जा सकता है। मेरी राय में, यह एक MAY है, MUST नहीं है। शेष URL में, इसे% 20 के रूप में एन्कोड किया गया है।

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

प्रपत्र डेटा एन्कोडिंग का यह तरीका बाद के HTML विनिर्देशों में भी दिया गया है। उदाहरण के लिए, HTML 4.01 विशिष्टता में एप्लिकेशन / x-www-form-urlencoded के बारे में प्रासंगिक पैराग्राफ देखें, और इसी तरह।

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

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

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

कार्यान्वयन उस प्रोग्रामिंग भाषा पर निर्भर करता है जिसे आपने चुना था।

यदि आपके URL में राष्ट्रीय वर्ण हैं, तो पहले उन्हें UTF-8 में एन्कोड करें और फिर प्रतिशत-परिणाम को एनकोड करें।


1
यदि अनुरोधित संसाधन HTML नहीं है, तो किसी को HTML विनिर्देश की परवाह क्यों करनी चाहिए? मैंने कुछ वेब APIs में "+" देखा है जो HTML के साथ प्रतिक्रिया नहीं देता है जैसे आप एक पीडीएफ का अनुरोध करते हैं। मैं इसे गलत मानता हूं कि वे "% 20" का उपयोग नहीं करते हैं।
अविश्वसनीय जनवरी

@ TheincredibleJan, मैं आपसे सहमत हूं। यही मेरा उत्तर है।
मैक्सिम मासियुटिन

1
@MaximMasiutin जब आपका उत्तर कहता है "यह एक MAY है, MUST नहीं", तो आप किस कल्पना का उल्लेख कर रहे हैं? मैं एक युक्ति खोजने के लिए संघर्ष कर रहा हूं जो कि एक के रूप में है। में w3.org/TR/1999/REC-html401-19991224/interact/... का उपयोग कर '+' (क्वेरी खंड में) कल्पना की एक 'चाहिए' अनुभाग के भीतर है।
जोसेफ

2
@ जोसेफ - अपने नोट के लिए धन्यवाद। यह MAY के बारे में मेरी लगातार राय है। मैंने पोस्ट को एडिट किया है। मेरा मतलब है कि HTML विनिर्देशन आपने "+" को परिभाषित किया है, लेकिन URL संदर्भ में, अन्य नियम लागू होते हैं, जो एन्कोडिंग रिक्त स्थान को% 20 के रूप में भी अनुमति देते हैं।
मैक्सिम मासियूटिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.