2011-02-01 5 views
9

मैं मुसीबत यूआरआई के लिए एक URL एन्कोडिंग आ रही हैं:यूआरएल एक "% 3 डी" को "% 253D" बदलता है

mUrl = "A string url that needs to be encoded for use in a new HttpGet()"; 
URL url = new URL(mUrl); 
URI uri = new URI(url.getProtocol(), url.getAuthority(), url.getPath(), 
    url.getQuery(), null); 

यह मैं क्या निम्न URL के लिए उम्मीद भी नहीं करता है:

स्ट्रिंग में पासिंग:

http://m.bloomingdales.com/img?url=http%3A%2F%2Fimages.bloomingdales.com%2Fis%2Fimage%2FBLM%2Fproducts%2F3%2Foptimized%2F1140443_fpx.tif%3Fwid%3D52%26qlt%3D90%2C0%26layer%3Dcomp%26op_sharpen%3D0%26resMode%3Dsharp2%26op_usm%3D0.7%2C1.0%2C0.5%2C0%26fmt%3Djpeg&ttl=30d

के रूप में बाहर आता है:

http://m.bloomingdales.com/img?url=http%253A%252F%252Fimages.bloomingdales.com%252Fis%252Fimage%252FBLM%252Fproducts%252F3%252Foptimized%252F1140443_fpx.tif%253Fwid%253D52%2526qlt%253D90%252C0%2526layer%253Dcomp%2526op_sharpen%253D0%2526resMode%253Dsharp2%2526op_usm%253D0.7%252C1.0%252C0.5%252C0%2526fmt%253Djpeg&ttl=30d

कौन सा टूट गया है। उदाहरण के लिए, %3D%253D में बदल गया है ऐसा लगता है कि यह पहले से ही स्ट्रिंग में% s के लिए रहस्यमय कुछ कर रहा है।

क्या चल रहा है और मैं यहां क्या गलत कर रहा हूं? जब यह यूआरएल पार्स

उत्तर

22

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

इसलिए, यह इस अंतिम चरण है कि, उदाहरण के लिए, ":" हो जाता है "%3A" (अच्छा) और "%3A" "%253A" हो जाता है (बुरा)। चूंकि आप पहले से एन्कोड किए गए यूआरएल में डाल रहे हैं, इसलिए आप उन्हें फिर से एन्कोड नहीं करना चाहते हैं।

इसलिए single-argument constructorURI आपका मित्र है। यह कुछ भी नहीं बचता है, और यह आवश्यक है कि आप एक पूर्व-भागने वाली स्ट्रिंग पास करें। इसलिए, आप URL बिल्कुल जरूरत नहीं:

mUrl = "A string url is already percent-encoded for use in a new HttpGet()"; 
URI uri = new URI(mUrl); 

* केवल एक समस्या यह है अपने यूआरएल कभी कभी प्रतिशत-एन्कोड नहीं रहे हैं, और कभी कभी वे कर रहे हैं। फिर आपको एक बड़ी समस्या है। आपको यह तय करने की ज़रूरत है कि आपका प्रोग्राम एक यूआरएल से शुरू हो रहा है जो हमेशा एन्कोड किया जाता है, या जिसे एन्कोड किया जाना चाहिए।

ध्यान दें कि ऐसी कोई बात नहीं है एक पूर्ण यूआरएल जो प्रतिशत-एन्कोडेड नहीं है। उदाहरण के लिए, आप पूर्ण यूआरएल "http://example.com/bob&co" नहीं ले सकते हैं और किसी भी तरह इसे ठीक से एन्कोडेड यूआरएल "http://example.com/bob%26co" में बदल सकते हैं - आप सिंटैक्स (जो बच नहीं पाए जाना चाहिए) और पात्रों के बीच अंतर कैसे बता सकते हैं (जो की)? यही कारण है कि URI के सिंगल-तर्क फ़ॉर्म की आवश्यकता है कि तार पहले से ही बच निकले हैं। यदि आपके पास अनचाहे तार हैं, तो आपको उन्हें से पहले पूर्ण यूआरएल सिंटैक्स में डालने की आवश्यकता है, और URI का बहु-तर्क कन्स्ट्रक्टर ऐसा करने में आपकी सहायता करता है।

संपादित करें: मुझे इस तथ्य को याद आया कि मूल कोड खंड को त्याग देता है।यदि आप यूआरएल के टुकड़े (या किसी अन्य भाग) को हटाना चाहते हैं, तो आप उपरोक्त के रूप में URI बना सकते हैं, फिर आवश्यकतानुसार सभी हिस्सों को खींचें (वे को नियमित तारों में डीकोड किया जाएगा), फिर उन्हें वापस पास करें URI बहु तर्क निर्माता (जहां वे हो जाएगा फिर से इनकोडिंग यूआरआई घटक के रूप में):

uri = new URI(uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), 
       uri.getPath(), uri.getQuery(), null) // Remove fragment 
+0

की अनुमति है, यह समझ में आता है, लिखने के लिए धन्यवाद। यूआरएल को एचटीएमएल कोड से खींचा जा रहा है, इसलिए मुझे लगता है कि उन्हें पहले ही एन्कोड किया जाना होगा? यूआरएल और बहु-तर्क कन्स्ट्रक्टर का उपयोग करने के कारणों में से एक कारण था क्योंकि मुझे यूआरआई से खंड (यदि कोई है) को हटाने की आवश्यकता थी। क्या डबल एन्कोडिंग को मजबूर किए बिना मैं ऐसा कर सकता हूं? क्या कुछ स्ट्रिंग urlMinusFragment = url.getProtocol() + ": //" + url.get प्राधिकरण() + url.getPath() + "?" + url.getQuery(); करने के लिए सुरक्षित रहो? तब मैं उस स्ट्रिंग को नए यूआरआई (स्ट्रिंग) कन्स्ट्रक्टर में फेंक सकता था। एक बार फिर धन्यवाद। – cottonBallPaws

+0

यदि आप एचटीएमएल में 'href' प्रॉपर्टी से बाहर निकल रहे हैं, तो उन्हें हमेशा ठीक से एन्कोड किया जाना चाहिए (यदि वे नहीं हैं, तो HTML अमान्य है, तो आप इसे एक त्रुटि के रूप में देख सकते हैं)। टुकड़े को हटाने के लिए तकनीक ठीक लगती है लेकिन आप मैन्युअल रूप से एक यूआरएल बना रहे हैं (जिसके लिए लाइब्रेरी है)। मैं यूआरआई कक्षा का उपयोग करूंगा। यूआरएल की तरह, यूआरआई में घटक गेटर्स हैं, लेकिन वे * डीकोडेड * स्ट्रिंग्स लौटते हैं जो यूआरआई में वापस सुरक्षित हैं। तो 'यूआरआई (uri.getScheme(), uri.getUserInfo(), uri.getHost(), uri.getPort(), uri.getPath(), uri.getQuery(), शून्य)' काम करना चाहिए। – mgiuca

+0

ब्रिलेंट, पूरी तरह से काम करता है। यूटीएफ -8 प्रारूप में धन्यवाद – cottonBallPaws

4

URL वर्ग% -sequences डिकोड नहीं किया, लेकिन URI वर्ग उन्हें (फिर) एन्कोडिंग है। यूआरएल स्ट्रिंग को पार्स करने के लिए URI का उपयोग करें।

Javadocs:

http://download.oracle.com/javase/6/docs/api/java/net/URL.html

यूआरएल वर्ग ही सांकेतिक शब्दों में बदलना नहीं करता है या भागने तंत्र RFC2396 में परिभाषित के अनुसार किसी भी URL में घटक डिकोड। किसी भी फ़ील्ड को एन्कोड करने के लिए कॉलर की ज़िम्मेदारी है, जिसे यूआरएल कॉल करने से पहले बचने की जरूरत है, और यूआरएल से लौटे गए किसी भी बच निकले खेतों को डीकोड करने की भी आवश्यकता है। इसके अलावा, क्योंकि URL को यूआरएल से बचने का कोई ज्ञान नहीं है, यह उसी यूआरएल के एन्कोडेड या डीकोडेड फॉर्म के बीच समानता को नहीं पहचानता है। उदाहरण के लिए, दो यूआरएल:

http://foo.com/hello world/ and http://foo.com/hello%20world 

एक दूसरे के बराबर नहीं माना जाएगा। नोट, यूआरआई कक्षा कुछ परिस्थितियों में अपने घटक क्षेत्रों से बचने का प्रदर्शन करती है।

एन्कोडिंग और यूआरएल की डिकोडिंग का प्रबंधन करने के लिए अनुशंसित तरीका यूआरआई उपयोग करने के लिए है, और इन दो वर्गों के बीच परिवर्तित करने के लिए उपयोग कर रहा Touri() और URI.toURL() है।

-2

यहाँ क्या हो रहा है कि पहले URL से % संकेत फरार हो जा रहा है, जिसका अर्थ है कि वे उत्पादन में %25 में बदल रहे हैं। आपको सावधानी बरतनी होगी ताकि आपकी स्क्रिप्ट केवल अल्फान्यूमेरिक वर्णों से बच जाए, साथ ही साथ कुछ प्रतीकों - लेकिन पहले से ही वर्णों से बच निकले।

ये कुछ अक्षर हैं जो भागने की जरूरत है:

< 
> 
" 
! 
# 
$ 
' 
(
) 
* 
, 
- 
. 
/
: 
; 
@ 
[ 
\ 
] 
^ 
_ 
` 
{ 
| 
} 
~ 

बाकी है, =, %, और &, और अक्षरांकीय अक्षर की तरह, नहीं है।

+1

नहीं, यह इसके बारे में सोचने का सही तरीका नहीं है। आपके पास पहले से ही एक पूर्ण प्रतिशत-एन्कोडेड यूआरएल है। प्रत्येक चरित्र जिसे पहले ही एन्कोड किया जाना आवश्यक है, एन्कोड किया गया है। यदि आपकी सलाह "%" संकेतों को एन्कोड नहीं करना है, तो निश्चित रूप से, "% 3A" "% 25AA" बनने के बजाय "% 3A" के रूप में रहेगा, लेकिन आप अन्य वाक्य रचनात्मक तत्वों को ओवर-एन्कोडिंग भी करेंगे। उदाहरण के लिए, "x = 4 और y = 7" (जिसका अर्थ है x "4" है और y "7" है) "x = 4% 26y = 7" बन जाएगा (जिसका अर्थ है x "4 और y = 7")। पात्रों का सटीक सही सेट प्राप्त करने का प्रयास करने का अर्थ है कि अधिक सामान्य मामले काम करेंगे, और आपके पास कम छोटी गाड़ी के मामले होंगे, लेकिन आप उन्हें खत्म नहीं करेंगे। – mgiuca

+0

इसके अलावा, आपने "=" और "%" सूचीबद्ध किया है क्योंकि दोनों को भागने की आवश्यकता है, और भागने की आवश्यकता नहीं है। – mgiuca

+0

उन त्रुटियों को इंगित करने के लिए धन्यवाद। थोड़ा फ्लाफकिटी के कोड के साथ क्या गलत था, इसकी मेरी धारणा यह थी कि कुछ पात्र डबल-एन्कोड किए गए थे। – pop850

4

% 3d का मतलब है,>=(समान)

एक nd

% 253D ->=(समान) दशमलव 6hex (बाइट) 3 डी

% 253D सीजीआई के लिए हेक्स सूचक : % 3 डी

+0

% 3 डी? हम% 3 डी,% 26 आदि वर्णों के साथ स्ट्रिंग को कैसे डीकोड कर सकते हैं? – Kushal