एक html स्थान% 20 के बजाय% 2520 के रूप में दिखा रहा है


109

फ़ायर्फ़ॉक्स ब्राउज़र में फ़ाइल नाम पास करने से यह रिक्त स्थान को बदलने का कारण बनता %2520 है %20

मेरे पास निम्नलिखित HTML है जिसे एक फ़ाइल में बुलाया गया है myhtml.html:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

जब मैं myhtml.htmlफ़ायरफ़ॉक्स में लोड करता हूं , तो छवि टूटी हुई छवि के रूप में दिखाई देती है। इसलिए मैं चित्र देखने के लिए लिंक पर क्लिक करता हूं और यह इस संशोधित URL को दिखाता है:

file:///c:/Documents%2520and%2520Settings/screenshots/Image01.png
                    ^
                    ^-----Firefox changed my space to %2520.

क्या बिल्ली है? इसने मेरे अंतरिक्ष को एक में बदल दिया %2520। यह एक करने के लिए इसे परिवर्तित नहीं होना चाहिए %20?

मैं इस HTML फ़ाइल को कैसे बदलूं ताकि ब्राउज़र को मेरी छवि मिल सके? यहाँ क्या चल रहा है?

जवाबों:


219

जो है, उसे समझाने के लिए थोड़ा सा %2520:

जैसे %20ही आपने खुद को नोट किया है, सामान्य अंतरिक्ष चरित्र एन्कोडेड है । %चरित्र के रूप में एन्कोड किया गया है %25

जिस तरह से आप प्राप्त %2520करते हैं जब आपका url पहले से ही इसमें %20होता है, और फिर से urlencoded हो जाता है, जो इसे बदल देता %20है %2520

क्या आप (या आपके द्वारा उपयोग किया जा रहा कोई ढांचा) डबल एन्कोडिंग वर्ण हैं?

संपादित करें: इस पर थोड़ा विस्तार करना, विशेष रूप से LOCAL लिंक के लिए। आप संसाधन से लिंक करना चाहते हैं C:\my path\my file.html:

  • यदि आप केवल एक स्थानीय फ़ाइल पथ प्रदान करते हैं, तो ब्राउज़र से अपेक्षा की जाती है कि दिए गए सभी वर्णों को एन्कोड करें और उनकी सुरक्षा करें, (जैसा कि ऊपर दिखाया गया है, आपको इसे रिक्त स्थान के साथ देना चाहिए, क्योंकि % यह एक मान्य फ़ाइल नाम वर्ण है और जैसे कि इसे एन्कोड किया जाएगा) परिवर्तित करते समय एक उचित URL के लिए (अगला बिंदु देखें)।
  • यदि आप file://प्रोटोकॉल के साथ एक URL प्रदान करते हैं, तो आप मूल रूप से यह कह रहे हैं कि आपने सभी सावधानियां बरती हैं और एन्कोडिंग की आवश्यकता है, एन्कोडिंग को विशेष वर्णों के रूप में माना जाना चाहिए। उपरोक्त उदाहरण में, आपको इस प्रकार प्रदान करना चाहिए file:///c:/my%20path/my%20file.html। स्लैश ठीक करने के अलावा, ग्राहकों को यहां वर्णों को एनकोड नहीं करना चाहिए।

टिप्पणियाँ:

  • स्लैश दिशा - फ़ॉरवर्ड स्लैश /का उपयोग URL, रिवर्स स्लैश में किया जाता है\ विंडोज़ पथ में हैं, लेकिन अधिकांश क्लाइंट दोनों को उचित फ़ॉरवर्ड स्लैश में परिवर्तित करके काम करेंगे।
  • इसके अलावा, प्रोटोकॉल नाम के बाद 3 स्लैश हैं, क्योंकि आप चुपचाप रिमोट मशीन के बजाय वर्तमान मशीन का जिक्र कर रहे हैं (पूर्ण अप्रत्यक्ष पथ होगा file://localhost/c:/my%20path/my%file.html), लेकिन फिर से अधिकांश क्लाइंट होस्ट भाग के बिना काम करेंगे (यानी केवल दो स्लैश ) आपको स्थानीय मशीन से मतलब है और तीसरे स्लैश को जोड़कर।

1
Hexblot वास्तव में यहाँ सही है। आमतौर पर ऐसा तब होता है जब आप प्रोग्रामिंग द्वारा अपने यूआरएल को एन्कोडिंग करना चाहते हैं, और एक बॉट अंदर आता है और इसे दूसरी बार एन्कोड करता है। बॉट्स को ऐसा करने की बुरी आदत है। दो थे आप इस मुद्दे को संभाल सकते हैं। 1) आप या तो 404 या 401 एक कोशिश पकड़ अपवाद के साथ कर सकते हैं या आप एक छोटा फ़ंक्शन लिख सकते हैं जो डबल डिकोड किए गए मानों को डिकोड करेगा इससे पहले कि आप इसे व्यापारिक तर्क के लिए किसी अन्य विधि को सौंप दें।
रायन वॉट्स

इससे मुझे यह पता लगाने में मदद मिली कि jQuery के अजाक्स अनुरोध भेजने पर मुझे यह क्यों मिल रहा है। मैं मान पर एन्कोडर्कोम्पोनेंट फ़ंक्शन के साथ एक अजाक्स GET अनुरोध में डेटा विशेषता सेट कर रहा था, लेकिन jQuery पहले से ही डिफ़ॉल्ट रूप से करता है, इसलिए मुझे% 2520 क्यों मिल रहा था। वास्तव में उपयोगी धन्यवाद।
अशर

क्या क्रोम के लिए कमांड लाइन तर्क नहीं है, यह बताने के लिए या तो व्याख्या करें या लिंक की व्याख्या न करें?
अलेक्स_

मेरे पास http://mysite/test & that... If I use UrlEncode है यह बदल जाता है, http://mysite/test%20&%20thatलेकिन मैं भी &बदलना चाहता हूं कि वह 26% में बदल जाए, इसलिए यह mysite / टेस्ट% 20% 26% 20% है `मैं यह कैसे कर सकता हूं?
Si8

10

कुछ के लिए - संभवतः मान्य - कारण दो बार url एन्कोड किया गया था। %25urlencoded %संकेत है। तो मूल url जैसा दिखता था:

http://server.com/my path/

फिर यह एक बार urlencoded हो गया:

http://server.com/my%20path/

और दो बार:

http://server.com/my%2520path/

तो आपको कोई भी urlencoding नहीं करनी चाहिए - आपके मामले में - जैसा कि अन्य घटकों को लगता है कि आपके लिए पहले से ही है। बस एक जगह का उपयोग करें


मुझे एक ही मुद्दा मिला, लेकिन मुझे समझ नहीं आता है कि पहली बार में डिफ़ॉल्ट urlencoding को दो बार क्यों संसाधित किया गया था।
जुंगवोन जिन

स्थिति के आधार पर, डबल-एन्कोडिंग सही ढंग से एन्कोडिंग का उपयोग करने का एक पूरी तरह से वैध परिणाम हो सकता है। यह उत्तर यह धारणा पैदा कर सकता है कि डबल-एन्कोडिंग हमेशा गलत होती है, और आप इसे "काम करने" के लिए आवश्यक के रूप में कई एन्कोड / यूनिकोड कॉल को जोड़कर एन्कोडिंग समस्याओं को ठीक कर सकते हैं। यह गलत है, और इस तरह से एन्कोडिंग कीड़े पहले स्थान पर आते हैं। -1
फ्लोरियन विंटर

@FlorianWinter मैं वास्तव में नहीं देख पा रहा हूँ जहाँ आप इसे लाइनों के बीच पढ़ते हैं। क्या तुम मेरी मदद कर सकते हो? (कृपया प्रश्न और मेरा उत्तर पढ़ें)
hek2mgl

7

जब आप फ़ायरफ़ॉक्स ब्राउज़र के माध्यम से एक स्थानीय फ़ाइल नाम पर जाने की कोशिश कर रहे हैं, तो आपको file:\\\प्रोटोकॉल को मजबूर करना होगा ( http://en.wikipedia.org/wiki/File_URI_scheme ) या फिर फ़ायरफ़ॉक्स आपके स्थान को एन्कोड कर देगा। इस से html स्निपेट बदलें:

<img src="C:\Documents and Settings\screenshots\Image01.png"/>

इसके लिए:

<img src="file:\\\C:\Documents and Settings\screenshots\Image01.png"/>

या यह:

<img src="file://C:\Documents and Settings\screenshots\Image01.png"/>

फिर फ़ायरफ़ॉक्स को सूचित किया जाता है कि यह एक स्थानीय फ़ाइल नाम है, और यह ब्राउज़र में छवि को सही ढंग से प्रस्तुत करता है, सही ढंग से एक बार स्ट्रिंग को एन्कोड करता है।

सहायक लिंक: http://support.mozilla.org/en-US/questions/900466


0

निम्नलिखित कोड स्निपेट ने मेरी समस्या हल कर दी। सोचा कि यह दूसरों के लिए उपयोगी हो सकता है।

var strEnc = this.$.txtSearch.value.replace(/\s/g, "-");
strEnc = strEnc.replace(/-/g, " ");

डिफ़ॉल्ट रूप से encodeURIComponentमेरे कोड की पहली पंक्ति का उपयोग करके सभी spacesको hyphensregex पैटर्न का उपयोग करने में परिवर्तित किया जा रहा है /\s\gऔर निम्न पंक्ति बस रिवर्स करता है, अर्थात दूसरे hyphensका spacesउपयोग करने के लिए सभी को वापस कनवर्ट करता है regex pattern /-/g। यहाँ /gवास्तव में finding allमिलान पात्रों के लिए जिम्मेदार है ।

जब मैं इस मूल्य को अपने अजाक्स कॉल पर भेज रहा हूं, तो यह normal spacesया तो ट्रेस %20हो जाता है और इस तरह से छुटकारा मिल जाता है double-encoding


1
मुझे लगता है क्योंकि आप इस मामले को हल नहीं कर रहे हैं, बस इसे कवर कर रहे हैं - मूल कारण यह अभी भी कहीं न कहीं है, और आप दोहरा काम कर रहे हैं (कहीं आप गलती से दो बार एन्कोडिंग कर रहे हैं, और कहीं और आप मैन्युअल रूप से डिकोड करने के लिए कवर करने के लिए हैं यह)। यह मानते हुए कि आप चीजों को "ठीक से" करना चाहते हैं, सबसे अच्छी बात यह होगी कि आप असली अपराधी को खोज लें।
निक एंड्रियोपोलोस

वास्तव में समाधान मेरे लिए काम किया जहाँ भी मुझे यह मुद्दा मिला। इसलिए मैंने पोस्ट किया।
सुब्रत सरकार

2
@NiladriSarkar जो हेक्सबोल्ट कहने की कोशिश कर रहा था कि जब आपका कोड काम करता है, तो यह एक व्यवहार्य समाधान नहीं है, बल्कि एक गंदा फिक्स है, और इससे बचा जाना चाहिए ...
2Dee

-1

इसे इस्तेमाल करे?

encodeURIComponent('space word').replace(/%20/g,'+')


1
StackOverflow में आपका स्वागत है! आम तौर पर उत्तर अधिक उपयोगी होते हैं यदि वे इस बारे में कुछ स्पष्टीकरण शामिल करते हैं कि आपका सुझाव केवल एक कोड स्निपेट के बजाय ओपी की समस्या को क्यों हल करेगा। इसके अलावा, चूंकि इस प्रश्न का पहले से ही स्वीकृत उत्तर है, इसलिए यह एक अच्छा विचार होगा कि कुछ स्पष्टीकरण को जोड़ा जाए क्योंकि आपका उत्तर उस से अधिक सही क्यों है।
डेवेडेवडेव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.