2012-02-12 16 views
8

क्या जावास्क्रिप्ट के एनकोडुरि फ़ंक्शन के लिए कोई वैध उपयोग है?एनकोडुरि का कभी भी उपयोग किया जाना चाहिए?

जहां तक ​​मेरा बता सकते हैं, जब आप एक HTTP अनुरोध या तो आप चाहिए बनाने की कोशिश कर रहे हैं:

  • एक पूरा यूआरआई
  • कुछ टुकड़ा आप एक URI, जो या तो है में डाल करना चाहते हैं एक यूनिकोड स्ट्रिंग या यूटीएफ -8 बाइट अनुक्रम

पहले मामले में, स्पष्ट रूप से अनुरोध करने के लिए कुछ भी करने की आवश्यकता नहीं है। नोट: यदि आप वास्तव में इसे पैरामीटर (उदा? Url = http ...) के रूप में पास करना चाहते हैं तो आपके पास वास्तव में दूसरे मामले का एक उदाहरण है जो यूआरआई की तरह दिखता है।

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

मान लीजिए कि मुझे कुछ भी याद आया है, मैं एन्कोडुरि के लिए वैध उपयोग नहीं देख सकता। यदि आप इसका उपयोग करते हैं, तो संभवतः आपने एक अवैध यूआरआई बनाया है और फिर तथ्य के बाद इसे "स्वच्छता" करने का प्रयास किया है, जो कि संभव नहीं है क्योंकि आप नहीं जानते कि कौन से पात्रों का शाब्दिक इरादा था, और जो बचने का इरादा रखते थे ।

मैंने भागने() का उपयोग करने के खिलाफ बहुत सी सलाह देखी है, लेकिन किसी को भी एन्कोडुरि को हतोत्साहित नहीं करते हैं। क्या मुझे वैध उपयोग याद आ रहा है?

+2

"कुछ खंड जो आप यूआरआई में रखना चाहते हैं", मुझे विश्वास है, जिसे "यूआरआई घटक" कहा जा सकता है। "दूसरे मामले में, आपको हमेशा एक यूनिकोड स्ट्रिंग को यूटीएफ -8 में परिवर्तित करना चाहिए" - जावास्क्रिप्ट में नहीं। 'encodeURIComponent' स्वचालित रूप से स्ट्रिंग को यूटीएफ -8 में परिवर्तित कर देगा (और' decodeURIComponent' यूटीएफ -8 ऑक्टेट्स को वापस यूनिकोड वर्णों में परिवर्तित करेगा)। – mgiuca

उत्तर

10

मेरे पास blog post है जो इस प्रश्न का उत्तर बहुत अधिक विस्तार से देता है।

आप चाहिए कभी नहीं उपयोग encodeURI कारणों से आप कहते हैं के लिए, प्रोग्राम के रूप में एक URI निर्माण करने के लिए - आप हमेशा अलग-अलग घटकों पर encodeURIComponent का उपयोग करना चाहिए, और फिर उन्हें पूरी तरह से यूआरआई में लिखें।

कहाँ encodeURI है लगभग उपयोगी है यूआरआई "सफाई", Postel's Law के अनुसार में ("आप क्या स्वीकार में उदार, और आप क्या भेजने में रूढ़िवादी हो।") कोई आपको एक पूरा यूआरआई देता है यदि यह, इसमें अवैध वर्ण हो सकते हैं, जैसे रिक्त स्थान, कुछ ASCII वर्ण (जैसे डबल-कोट्स) और यूनिकोड वर्ण। encodeURI उन अवैध पात्रों को एन्कोडिंग डिलीमीटर के बिना, कानूनी प्रतिशत-बच निकले अनुक्रमों में परिवर्तित करने के लिए उपयोग किया जा सकता है। इसी तरह, decodeURI का उपयोग यूआरआई को "सुंदर-प्रिंट" करने के लिए किया जा सकता है, जो प्रतिशत से बचने वाले अनुक्रमों को तकनीकी रूप से गैरकानूनी नंगे पात्रों के रूप में दिखाता है।

उदाहरण के लिए, यूआरएल:

http://example.com/admin/login?name=Helen Ødegård&gender=f 

अवैध है, लेकिन यह अभी भी पूरी तरह से स्पष्ट है।encodeURI वैध यूआरआई में बदल:

http://example.com/admin/login?name=Helen%20%C3%98deg%C3%A5rd&gender=f 

एक आवेदन है कि "यूआरआई सफाई" की इस तरह कार्य करना चाहेंगे का एक उदाहरण एक वेब ब्राउज़र है। जब आप पता बार में एक यूआरएल टाइप करते हैं, तो उसे किसी त्रुटि के बजाए किसी भी अवैध पात्र को प्रतिशत-एस्केप में परिवर्तित करने का प्रयास करना चाहिए। सॉफ़्टवेयर जो यूआरआई को संसाधित करता है (उदाहरण के लिए, एक HTML स्क्रैपर जो किसी पृष्ठ पर हाइपरलिंक्स में सभी यूआरएल प्राप्त करना चाहता है) किसी भी यूआरएल तकनीकी रूप से अवैध होने पर इस प्रकार की सफाई भी लागू कर सकता है।

दुर्भाग्यवश, encodeURI में एक गंभीर दोष है, जो कि यह '%' वर्णों से बच निकलता है, जिससे यह यूआरआई सफाई के लिए पूरी तरह से बेकार हो जाता है (यह किसी भी यूआरआई से पहले से बच जाएगा जो पहले से ही प्रतिशत-भाग निकलता है)। इसलिए मैं Mozilla's fixedEncodeURI समारोह उधार और यह सुधार है ताकि वह यूआरआई साफ है:

function fixedEncodeURI(str) { 
    return encodeURI(str).replace(/%25/g, '%').replace(/%5B/g, '[').replace(/%5D/g, ']'); 
} 

इसलिए आप हमेशा encodeURIComponent का उपयोग करना चाहिए आंतरिक यूआरआई के निर्माण के लिए। आपको केवल encodeURI का उपयोग नहीं करना चाहिए, लेकिन आप बाहरी स्रोत (आमतौर पर उपयोगकर्ता इंटरफ़ेस के हिस्से के रूप में) प्रदान किए गए यूआरआई को "साफ" करने के प्रयास के लिए मेरे fixedEncodeURI का उपयोग कर सकते हैं।

+1

मैं यहां उपयोग (और इसके साथ सहमत) देखता हूं, लेकिन मुझे विश्वास नहीं है कि एनकोडुरि आपके वर्णन का कार्यान्वयन है। एनकोडुरि "% 2F" को "% 252F" में परिवर्तित करता है, जो कुछ यूआरआई के अर्थ को दोबारा से बचकर बदलता है। – gfxmonk

+0

अरग, आप सही हैं। मैंने अपना ब्लॉग पोस्ट अपडेट किया है ("एडिट" के लिए खोजें)। इसमें फिक्स्ड एन्कोडुरि (मोज़िला से उधार लिया गया और सुधार हुआ) नामक एक फ़ंक्शन शामिल है जो वास्तव में जिस तरीके से मैंने मूल रूप से वर्णित किया है उसका व्यवहार करता है। वास्तविक एनकोडुरि फ़ंक्शन, जैसा कि यह खड़ा है, पूरी बकवास है। – mgiuca

+0

मैंने एक सुझाए गए काम के साथ, एनकोडुरि में दोष दिखाने के लिए उत्तर संपादित किया। – mgiuca

5

एन्कोडुरि निम्नलिखित को एन्कोड नहीं करता है:, /? : @ & = + $ # जबकि encodeURIComponent करता है।

ऐसे कई कारण हैं जिनसे आप एनकोडुरिकॉम्पोनेंट पर एन्कोडुरि का उपयोग करना चाहेंगे, जैसे यूआरएल को वैरिएबल वैल्यू के रूप में असाइन करना। आप यूआरएल को बनाए रखना चाहते हैं लेकिन पथ, क्वेरी स्ट्रिंग और हैश मानों को एन्कोड करना चाहते हैं। EncodeURIComponent का उपयोग करके यूआरएल अवैध हो जाएगा।

+1

"एक वैरिएबल वैल्यू के रूप में यूआरएल असाइन करना" का क्या मतलब है? क्या आपका मतलब एक क्वेरी पैरामीटर में मान के रूप में यूआरएल समेत है? यदि आपके पास "http://example.com/?x=1&y=2" जैसे यूआरएल हैं और इसे एक क्वेरी पैरामीटर के रूप में पास करना चाहते हैं, तो आपको निश्चित रूप से एन्कोडुरिकॉम्पोनेंट का उपयोग करना चाहिए, क्योंकि एन्कोडुरि "&" से बचने में विफल रहेगा। – gfxmonk

+0

var x = myencodedurl; –

+0

मुझे खेद है, लेकिन यह कोई समझ नहीं आता है। एक चर में स्टोर करने के लिए आपने कभी स्ट्रिंग के _value_ को क्यों बदल दिया है (जो कि यूआरआई जेएस में होगा)? – gfxmonk

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