2010-12-27 6 views
155

एन्कोडिंग यूआरएल के लिए इनमें से किन तरीकों का उपयोग किया जाना चाहिए?क्या मुझे एन्कोडिंग यूआरएल के लिए एन्कोडुरि या एनकोडुरिकोम्पोनेंट का उपयोग करना चाहिए?

+3

यह भी देखें http://stackoverflow.com/a/3608791/632951 – Pacerier

+7

एक बड़ा अंतर यह है कि 'एनकोडुरि' '/' को एन्कोड नहीं करेगा: 'encodeURIComponent (" ac/dc ")' => 'ac % 2 एफडीसी' और 'एनकोडुरि (" एसी/डीसी ")' => 'एसी/डीसी' – JoeRocc

उत्तर

194

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

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

encodeURIComponent विशेष अर्थ के साथ सब कुछ सांकेतिक शब्दों में बदलना होगा, ताकि आप इस तरह के

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

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

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

+1

यदि मैं AJAX का उपयोग कर रहा हूं तो मैं PHP को पारित यूआरएल कैसे डीकोड करूं? –

+5

आप नहीं करते हैं। वेबसर्वर स्वचालित रूप से करता है। – Quentin

+0

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

29

http://xkr.us/articles/javascript/encode-compare/ एक महान चर्चा के रूप में यूआरआई के घटकों के लिए इसका इस्तेमाल करते हैं, उदाहरण के साथ। उनके सारांश को उद्धृत करने के लिए:

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

बच() सांकेतिक शब्दों में बदलना नहीं होगा:।। @ */+

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

encodeURI() सांकेतिक शब्दों में बदलना नहीं होगा: ~ @ # $ & *() =: /; + '

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

encodeURIComponent() सांकेतिक शब्दों में बदलना होगा नहीं: ~ *() ' "

8

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

encodeURI():। मौजूदा यूआरएल

0

एन्कोडिंग मामले में के लिए प्रयोग किया जाता है आप भी इन पात्रों सांकेतिक शब्दों में बदलना चाहते हैं: तो ! ' *) (, समाधान है:

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

(source)

+5

आपको url में उन charachters से बच नहीं होना चाहिए। – Arashsoft

+0

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

+0

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

-2

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

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