URL स्कीम / होस्ट / पाथ में एक '+' एक स्पेस का प्रतिनिधित्व करता है?


224

मुझे पता है कि +URL के क्वेरी स्ट्रिंग में एक स्थान का प्रतिनिधित्व करता है। क्या यह क्वेरी स्ट्रिंग क्षेत्र के बाहर का भी मामला है? यह कहना है, निम्न URL करता है:

http://a.com/a+b/c

वास्तव में प्रतिनिधित्व करते हैं:

http://a.com/a b/c

(और इस प्रकार इनकोडिंग की आवश्यकता है अगर यह वास्तव में होना चाहिए +), या क्या यह वास्तव में वास्तव में प्रतिनिधित्व करता है a+b/c?



4
ध्यान दें कि php में एक स्थान पर% 2b (एन्कोडेड +) को डीकोड करता है। इस उपयोग से बचने के लिए rawurldecode। मैं इसे संदर्भ के लिए यहां कहता हूं क्योंकि यह "php url decode break on plus symbol" के लिए Google खोज पर उच्च श्रेणी का परिणाम है।
danielson317

जवाबों:


170
  • URL के पथ अनुभाग में प्रतिशत एन्कोडिंग के डिकोड होने की उम्मीद है, लेकिन
  • +पथ घटक में किसी भी वर्ण का शाब्दिक रूप से व्यवहार किया जाना अपेक्षित है।

स्पष्ट होना: +क्वेरी घटक में केवल एक विशेष वर्ण है।


12
+1 दुर्भाग्य से, वहाँ के कई "URL कोडर्स / एनकोडर" जंगल में इसे नहीं समझते हैं। जैसे sislands.com/coin70/week6/encoder.htm keyone.co.uk/tools-url-encoder.asp meyerweb.com/eric/tools/dencoder
leonbloy

11
@ स्टोबोर: उद्धरण की आवश्यकता है।
bukzor

8
@Stobor RFC ने कभी कहा कि +चरित्र को क्वेरी घटक में एक स्थान के रूप में व्याख्यायित किया गया है? या यह केवल एक नियम है "जंगली से"?
पचेरियर

44
@Pacerier और @bukzor: RFC 1738 (2396 और 3986 द्वारा संशोधित) योजना ( http:), प्राधिकरण ( //server.example.com), और पथ ( /myfile/mypage.htm) घटक को परिभाषित करता है, और +चरित्र के लिए किसी विशेष अर्थ को परिभाषित नहीं करता है । HTML युक्ति क्वेरी घटक को माइम प्रकार के अनुप्रयोग / x-www-form-urlencoded के रूप में परिभाषित करता है जिसे " +RFC1738 के रूप में रिक्त स्थान और अन्य विशेष वर्णों के साथ" के रूप में परिभाषित किया गया है । तो यह "जंगली से" नहीं है, लेकिन यह एक स्वीकृत (गैर-आरएफसी) मानक से है।
स्टोबोर

2
.NET विधि Server.UrlEncodeत्रुटिपूर्ण रूप से रिक्त स्थान को एनकोड करती है क्योंकि पथ भाग में भी HTTP नियम का उल्लंघन होता है।
सनकैट २२

243

आप W3Schools पर संबंधित URL एन्कोड किए गए वर्णों की एक अच्छी सूची पा सकते हैं ।

  • + हो जाता है %2B
  • जगह बन जाती है %20

18
यह URL पर पथ घटक में प्रदर्शित होने के लिए शाब्दिक '+' वर्णों के लिए पूरी तरह से कानूनी है ।
सैम स्टेंसबी

4
एक शाब्दिक + पीछे के अंत तक प्राप्त करने के लिए (या, कम से कम PHP) यह ट्रिपल एन्कोडेड होना चाहिए:%25252B
छाता

11
यह उत्तर प्रश्न के लिए पूरी तरह अप्रासंगिक है।
निस्स एन्गस्ट्रोम जूल

22

अंतरिक्ष वर्ण केवल एक संदर्भ में "+" के रूप में एन्कोड किया जा सकता है: अनुप्रयोग / x-www-form-urlencoded कुंजी-मूल्य जोड़े।

RFC-1866 (HTML 2.0 विनिर्देश), पैरा 8.2.1। उपप्रकार 1. कहता है: "प्रपत्र फ़ील्ड नाम और मान बच गए हैं: अंतरिक्ष वर्णों को '+' द्वारा प्रतिस्थापित किया जाता है, और फिर आरक्षित वर्ण बच जाते हैं")।

यहां URL में ऐसे स्ट्रिंग का एक उदाहरण है जहां RFC-1866 प्लस के रूप में एन्कोडिंग रिक्त स्थान की अनुमति देता है: " http://example.com/over/there?name=foo+bar "। तो, केवल "?" के बाद, रिक्त स्थान को प्लसस द्वारा प्रतिस्थापित किया जा सकता है (अन्य मामलों में, रिक्त स्थान% 20 तक एन्कोड किया जाना चाहिए)। प्रपत्र डेटा एन्कोडिंग का यह तरीका बाद के HTML विनिर्देशों में भी दिया गया है, उदाहरण के लिए, HTML 4.01 विशिष्टता में एप्लिकेशन / x-www-form-urlencoded के बारे में प्रासंगिक पैराग्राफ देखें, और इसी तरह।

लेकिन, क्योंकि यह हमेशा संदर्भ को सही ढंग से निर्धारित करने के लिए कठिन है, इसलिए रिक्त स्थान को कभी भी "+" के रूप में सांकेतिक शब्दों में बदलना नहीं है। RFC-3986, p.2.3 में परिभाषित "अनारक्षित" को छोड़कर सभी वर्णों को प्रतिशत-सांकेतिक शब्दों में बदलना बेहतर है। यहां एक कोड उदाहरण है जो दिखाता है कि एन्कोडेड क्या होना चाहिए। यह डेल्फी (पास्कल) प्रोग्रामिंग भाषा में दिया गया है, लेकिन यह समझना बहुत आसान है कि यह किसी भी प्रोग्रामर के लिए कैसे काम करता है, चाहे उसकी भाषा कोई भी हो:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const    
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;

0

url को ठीक करने के लिए encodeURIComponent फ़ंक्शन का उपयोग करें, यह ब्राउज़र और node.js पर काम करता है

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'

1
यह प्रश्न को संबोधित नहीं करता है। और, एक विशिष्ट भाषा (जावास्क्रिप्ट) के साथ, गलत तरीके से URL को एनकोड करता है - संदर्भ के आधार पर, आप संभवत: यह एनकोड नहीं करना चाहते हैं कि आपको URL के लिए विशेष (शाब्दिक) स्लैश (/) और कॉलन (:) की आवश्यकता नहीं है) ।
ग्रेमियो

धन्यवाद यह वास्तव में मेरी मदद की!
qwsd

-2

नीचे आज़माएँ:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

2
मुझे यह बहुत अजीब लगता है कि दो लोगों ने इस जवाब को वोट दिया। इसका शाब्दिक रूप से सवाल से कोई लेना-देना नहीं है।
एंड्रयू बार्बर

1
कैसे अन्य पात्रों के लिए * @ - _ +। /
रवि

1
@AndrewBarber आपने इसे अप्रासंगिक क्यों पाया? +% 2B हो जाता है
जावा लड़का

यह कई कारणों से गलत है ... escapeपदावनत किया जाता है, इसके बजाय आपको encodeURIक्वेरी भाग के मामले में उपयोग करना चाहिए encodeURIComponent। इसके अलावा पैरामीटर स्ट्रिंग को w3c के अनुसार एनकोड करना चाहिए ।
क्रिस्टोफ

-5

आप हमेशा URL को एनकोड करेंगे।

यहां बताया गया है कि रूबी आपके URL को कैसे एनकोड करती है:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"

8
मुझे यकीन नहीं है कि यह सही है। RFC2396 ( ietf.org/rfc/rfc2396.txt ) के अनुसार , यूआरआई के पथ (खंडों) में क्वेरीज़ केवल आरक्षित घटक नहीं हैं। ऐसा प्रतीत होता है कि उन्हें URL एनकोडेड करने की आवश्यकता नहीं है और इस तरह से पथ के रिक्त स्थान के रूप में व्याख्या नहीं की जानी चाहिए, केवल क्वेरी में।
tlrobinson

3
1738 rfc रिक्ति के रूप में pluses का इलाज करता है। यह सब उस पर निर्भर करता है जो आपके एन्कोड / डिकोड फ़ंक्शन द्वारा कार्यान्वित किया जाता है। उदाहरण के लिए, php में, रॉर्क्लेंकोडे 1738 rfc का अनुसरण करता है, जबकि urlencode rfc 2396 का अनुसरण करता है।
जोनाथन फिंगलैंड

1
देखें, अब मुझे कुछ अतिरिक्त भ्रम है। उदाहरण में आपने मुझे ऊपर दिया था, a.com% 2Fa% 2Bb वह नहीं है जो मैं चाहता हूं, यह बहुत कम से कम aaa%2Bb होगा। यह एक वास्तविक URL है, जिसके साथ मैं काम कर रहा हूं, न कि एक क्वेरी स्ट्रिंग में एक पैरामीटर के रूप में पारित किया जाने वाला URL। एक छोटी पृष्ठभूमि के लिए जो स्पष्ट करने में मदद कर सकती है, मैक ओएस एक्स फाइंडर मुझे फाइल सिस्टम URL लौटा रहा है। इसलिए अगर मेरे पास "a; + b.txt" नाम की फ़ाइल है, तो यह कुछ ऐसा दिखता है जो "फ़ाइल: //a%3F+b.txt" की तरह दिखता है, न कि "फ़ाइल: //a%3F%2B.txt" । खोजक सिर्फ गलत है, या क्वेरी स्ट्रिंग से पहले एक + वास्तव में एक प्लस है?
फ्रांसिस्को रयान टॉल्मास्की I

2
जोनाथन: क्या आप सुनिश्चित हैं कि 1738 कहते हैं + आरक्षित है? मैं देखता हूं: सुरक्षित = "$" | "-" | "_" | "।" | "+" अनारक्षित = अल्फा | अंक | सुरक्षित | अतिरिक्त रूप में अच्छी तरह से: इस प्रकार, केवल अल्फ़ान्यूमेरिक्स, विशेष वर्ण "$ -_। +! *" (), ", और उनके आरक्षित उद्देश्यों के लिए उपयोग किए जाने वाले आरक्षित वर्णों का उपयोग URL के भीतर अनएन्कोड किया जा सकता है।
ट्रोब्रिंसन

2
"तुम हमेशा बच निकलोगे" को और अधिक योग्यता की आवश्यकता है, और जवाब वैसे भी सवाल के लिए अप्रासंगिक है।
बग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.