क्या मुझे एन्कोडिंग URL के लिए encodeURI या encodeURIComponent का उपयोग करना चाहिए?


281

URL को एन्कोडिंग के लिए इन दोनों में से किस विधि का उपयोग किया जाना चाहिए?



13
एक बड़ा अंतर यह है कि encodeURIऐसा नहीं होगा /: encodeURIComponent("ac/dc")=> ac%2Fdcऔर encodeURI("ac/dc")=>ac/dc

यह उपयोगी हो सकता है: "encodeURIComponent() and encodeURI() encode a URI by replacing URL reserved characters with their UTF-8 encoding....They differ because encodeURI does not encode queryString or hash values...URLs do not allow many special characters, like spaces or slashes. However these special characters are part of life, so URL encoding was invented." स्रोत
user1063287

इसके अलावा विशिष्ट अनुभाग देखें encodeURIComponent differs from encodeURI as follows: जिसका शीर्षक है: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
user1063287

जवाबों:


324

यह इस बात पर निर्भर करता है कि आप वास्तव में क्या करना चाहते हैं।

encodeURI मानता है कि इनपुट एक पूर्ण URI है जिसमें कुछ वर्ण हो सकते हैं जिन्हें इसमें एन्कोडिंग की आवश्यकता होती है।

encodeURIComponent विशेष अर्थ के साथ सब कुछ सांकेतिक शब्दों में बदलना होगा, इसलिए आप इसका उपयोग URI जैसे घटकों के लिए करते हैं

var world = "A string with symbols & characters that have special meaning?";
var uri = 'http://example.com/foo?hello=' + encodeURIComponent(world);

108

यदि आप URL घटक (एक querystring पैरामीटर) में डालने के लिए एक स्ट्रिंग एन्कोडिंग कर रहे हैं, तो आपको कॉल करना चाहिए encodeURIComponent

यदि आप किसी मौजूदा URL को एन्कोडिंग कर रहे हैं, तो कॉल करें encodeURI


1
अगर मैं अजाक्स का उपयोग कर रहा हूं तो मैं url को कैसे डीकोड करूं जो php को पास किया गया है?
आदित्य शुक्ला

6
तुम नहीं। वेबसर्वर स्वचालित रूप से ऐसा करता है।
क्वेंटिन

@ आदित्य: यह निर्भर करता है कि आप क्या कर रहे हैं।
SLAKs

@ slaks। मैं मापदंडों को प्राप्त कर रहा हूँ ताकि मैं उन्हें php में पुनः प्राप्त करना चाहता हूँ।
आदित्य शुक्ला

2
कुंआ। हो सकता है कि मैं थोड़ा जल्दबाजी में बोलूं जब मैंने कहा था कि वेबसर्वर यह करेगा, लेकिन जो भी लाइब्रेरी आप अपने फॉर्म डेटा को पढ़ने के लिए उपयोग करते हैं, वह आपके लिए इसका ध्यान रखेगा।
क्वेंटिन

46

xkr.us की एक महान चर्चा है, उदाहरण के साथ। उनके सारांश को उद्धृत करने के लिए:

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

एस्केप () एनकोड नहीं होगा: @ * / +

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

encodeURI () एनकोड नहीं करेगा: ~! @ # $ & * () =: /;,; + '

अंत में, एक यूआरआई के एकल घटक को एन्कोडिंग करते समय एन्कोडोडाइकोम्पोनेंट () विधि का उपयोग ज्यादातर मामलों में किया जाना चाहिए। यह विधि कुछ निश्चित वर्णों को कूटबद्ध करेगी जिन्हें आमतौर पर URI के लिए विशेष वर्णों के रूप में मान्यता दी जाएगी ताकि कई घटक शामिल किए जा सकें। ध्यान दें कि यह विधि 'वर्ण को एन्कोड नहीं करती है, क्योंकि यह URI के भीतर एक मान्य वर्ण है।

encodeURIComponent () एन्कोड नहीं होगा: ~! * () '


हाल ही में सीखा। TOMCAT 9 सर्वर अधिक विशिष्ट हैं जो आप URL पर भेज सकते हैं। एन्कोडोडाइकम्पोनेंट () उन मामलों में बेहतर काम करता दिखाई देता है, जहाँ आपको "एनकोड" करने की आवश्यकता होती है। टॉमकैट 8 की परवाह नहीं की गई, लेकिन 9 को अधिक विशेष रूप से पसंद किया गया है।
एग्गी जॉन ऑफ 87

तो दूसरे शब्दों में encodeURIविफल रहता है अगर आप एक फ़ाइल नाम को URL में बदलने का प्रयास कर रहे हैं और फ़ाइल नाम #उसमें है
gman

17

यहाँ एक सारांश है।

  1. भागने () एनकोड नहीं होगा @ * _ + -। /

    इसका प्रयोग न करें।

  2. एनकोडेरी () AZ az 0-9 को एनकोड नहीं करेगा; , /? : @ & = + $ - _। ! ~ * '() #

    जब आपका इनपुट पूर्ण URL हो, जैसे ' https://searchexample.com/search?q=wiki '

  3. encodeURIComponent () AZ az 0-9 - _ को एनकोड नहीं करेगा। ! ~ * '() इसका प्रयोग तब करें जब आपका इनपुट पूर्ण URL जैसे का हिस्सा हो const queryStr = encodeURIComponent(someString)

1
यह एक उत्कृष्ट उत्तर है क्योंकि यह बताता है कि वे क्या करते हैं। हालांकि मेरे पास अभी भी एक सवाल है कि मुझे किसका उपयोग करना चाहिए और कब करना चाहिए। क्या होगा यदि मेरा URI -component एक पूर्ण URL है? क्या मुझे इसके बाद नियम 2 या नियम 3 का उपयोग ऊपर से करना चाहिए या शायद बाड़े की तरह encodeURIComponent (EncodeURI (theCompleteURI))
Panu Logic

10

encodeURIComponent (): मानता है कि इसका तर्क URI का एक भाग (जैसे प्रोटोकॉल, होस्टनाम, पथ या क्वेरी स्ट्रिंग) है। इसलिए यह विराम चिह्न वर्णों से बच जाता है जो कि एक URI के भागों को अलग करने के लिए उपयोग किए जाते हैं।

एन्कोडोडी (): मौजूदा यूआरएल को कूटने के लिए प्रयोग किया जाता है


7

के बीच अंतर encodeURIऔर encodeURIComponent:

encodeURIComponent(value)मुख्य रूप से क्वेरीस्ट्रीमिंग पैरामीटर मानों को एनकोड करने के लिए उपयोग किया जाता है, और यह हर लागू चरित्र को इनकोड करता है valueencodeURIप्रोटोकॉल उपसर्ग ( http://) और डोमेन नाम को अनदेखा करता है ।


बहुत, बहुत दुर्लभ मामलों में, जब आप अतिरिक्त वर्णों को एन्कोड करने के लिए मैन्युअल एन्कोडिंग को लागू करना चाहते हैं (हालांकि उन्हें विशिष्ट मामलों में एन्कोडेड करने की आवश्यकता नहीं है):, ! *तो आप उपयोग कर सकते हैं:

function fixedEncodeURIComponent(str) {
  return encodeURIComponent(str).replace(/[!*]/g, function(c) {
    return '%' + c.charCodeAt(0).toString(16);
  });
}

( स्रोत )


6
आपको url में उन चरचों से बचना नहीं चाहिए।
अराशॉफ्ट

जैसा कि उद्धृत दस्तावेज़ कहता है: "इन वर्णों में कोई औपचारिक यूआरआई परिसीमन उपयोग नहीं होता है"
caesarsol

@ ऑस्करसोल, तो क्या मुझे अपना उत्तर संपादित करना चाहिए। अपने विचार मुझे बताएं क्योंकि मैं समझ सकता हूं कि उद्धृत दस्तावेज का क्या मतलब है ..
टी

जब तक आप सामान्य URL-एन्कोडिंग उपयोग मामलों से बाहर कुछ नहीं कर रहे हैं, तब तक इन वर्णों को एनकोड करना बेकार है:
caesarsol

2

अन्य उत्तर उद्देश्यों का वर्णन करते हैं। यहाँ वर्ण प्रत्येक फ़ंक्शन वास्तव में परिवर्तित होंगे :

control = '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F'
        + '\x10\x11\x12\x13\x14\X15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F'
                                                                    + '\x7F'
encodeURI         (control + ' "%<>[\\]^`{|}'                             )
encodeURIComponent(control + ' "%<>[\\]^`{|}' + '#$&,:;=?' + '+/@'        )
escape            (control + ' "%<>[\\]^`{|}' + '#$&,:;=?' +       "!'()~")

उपरोक्त सभी वर्ण प्रतिशत-हेक्साडेसिमल कोड में बदल दिए गए हैं। करने के लिए अंतरिक्ष %20, प्रतिशत करने के लिए%25 , से नीचे आदि अपरिवर्तित से गुजरते हैं।

यहाँ वर्ण परिवर्तित नहीं होंगे :

pass_thru = '*-._0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

encodeURI         (pass_thru + '#$&,:;=?' + '+/@' + "!'()~")
encodeURIComponent(pass_thru +                      "!'()~")
escape            (pass_thru +              '+/@'          )

-4

एक सामान्य नियम के रूप में encodeURIComponent। लंबे नाम से यह सोचकर डरें नहीं कि यह उपयोग में अधिक विशिष्ट है, मेरे लिए यह अधिक सामान्यतः उपयोग की जाने वाली विधि है। एन्कोडेरी का उपयोग करने में भी चूसा न जाए क्योंकि आपने इसका परीक्षण किया था और यह ठीक से एन्कोडिंग प्रतीत होता है, यह संभवतः वह नहीं है जिसका आप उपयोग करना चाहते थे और भले ही आपके पहले नाम क्षेत्र में "फ्रेड" का उपयोग करते हुए आपके सरल परीक्षण ने काम किया हो, आप पाएंगे। बाद में जब आप अधिक उन्नत पाठ का उपयोग करते हैं जैसे कि एम्परसेंड या हैशटैग जोड़ना यह विफल हो जाएगा। आप अन्य कारणों पर गौर कर सकते हैं कि ऐसा क्यों है।

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