2011-06-30 10 views
16

मैं परीक्षण कर रहा हूँ पीएचपीurlencode() बनाम जावाjava.net.URLEncoder.encode()urlencode() 'तारांकन' (स्टार?) चरित्र

जावा

String all = ""; 
for (int i = 32; i < 256; ++i) { 
    all += (char) i; 
} 

System.out.println("All characters:   -||" + all + "||-"); 
try { 
    System.out.println("Encoded characters:  -||" + URLEncoder.encode(all, "utf8") + "||-"); 
} catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
} 

पीएचपी

$all = ""; 
for($i = 32; $i < 256; ++$i) 
{ 
    $all = $all.chr($i); 
} 

echo($all.PHP_EOL); 
echo(urlencode(utf8_encode($all)).PHP_EOL); 

सभी वर्ण, दोनों कार्यों के साथ एक ही तरीके से एन्कोड करने की 'तारे का चिह्न' चरित्र कि द्वारा इनकोडिंग नहीं है के लिए छोड़कर लगते हैं जावा, और PHP द्वारा% 2A में अनुवाद किया गया। कौन सा व्यवहार 'सही' होना चाहिए, यदि कोई है?

नोट: मैंने rawurlencode() के साथ भी कोशिश की - कोई भाग्य नहीं।

+0

मैं एक [समान प्रश्न] कहा है (http://stackoverflow.com/questions/25085992/when-should-an-asterisk-be-encoded-in-an-http-url) करने के लिए अधिक व्यापक उत्तर पाने का प्रयास करें। –

उत्तर

8

यूआरएल में * होना ठीक है, (लेकिन यह इसके एन्कोडेड फॉर्म में भी ठीक है)।

RFC1738: Uniform Resource Locators (URL) राज्यों निम्नलिखित:

सुरक्षित:

[...]

आम तौर पर एक यूआरएल एक ही व्याख्या जब ओकटेट है वर्ण द्वारा प्रस्तुत है और जब यह एन्कोड किया गया। हालांकि, यह आरक्षित वर्णों के लिए सत्य नहीं है: के लिए आरक्षित एक वर्ण एन्कोडिंग विशेष योजना किसी URL के अर्थशास्त्र को बदल सकती है।

इस प्रकार, केवल अक्षर या अंक, विशेष वर्ण "$-_.+!*'(),", और सुरक्षित वर्णों उनके आरक्षित प्रयोजनों के लिए प्रयोग किया जाता किसी URL में इस्तेमाल किया जा सकता unencoded

दूसरी ओर, अक्षर हैं जो (अक्षर या अंक सहित) एन्कोड करने की आवश्यकता नहीं है योजना विशेष के एक यूआरएल की भाग के भीतर इनकोडिंग जा सकता है, जब तक कि वे एक सुरक्षित के लिए इस्तेमाल नहीं किया जा रहा है उद्देश्य।

+0

+1 वास्तव में, सेट '$ -_। +! *'(), '' से, जावा, केवल '-_। * 'का उपयोग अनएन्डेड रूप में करता है: http://docs.oracle.com/javase/7/ दस्तावेज़/एपीआई/जावा/नेट/URLEncoder.html – caw

+1

और जावा और PHP के बीच एकमात्र अंतर तारांकन प्रतीत होता है: PHP '% 2A' का उपयोग करता है जबकि जावा' * 'का उपयोग करता है। – caw

6

Wikipedia suggests कि * एक सुरक्षित चरित्र जब यह यूआरआई के लिए आता है, और कहा कि अगर आरक्षित उद्देश्य के लिए नहीं यह एन्कोड किया जाना चाहिए है। RFC3986 के अनुसार, पृष्ठों 12-13:

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

reserved = gen-delims/sub-delims 

    gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

(तथ्य यह है कि अभी भी the URL RFC* चरित्र unencoded जाना करने की अनुमति देता है कि करता एक आरक्षित उद्देश्य मैं URL नहीं, और इस तरह के रूप में एन्कोड किया जाना है। तो मौसम नहीं है है आप इसे सांकेतिक शब्दों में बदलना करने के लिए है या यूआरआई किस तरह आप बना रहे हैं पर निर्भर करता है नहीं)

+0

क्या आप उस पृष्ठ से उद्धरण शामिल कर सकते हैं जिसमें कहा गया है कि '*' को एन्कोड किया जाना चाहिए? – aioobe

+0

@aioobe: हो गया। यूआरएल और यूआरआई आरएफसी के बीच एक विसंगति प्रतीत होती है, जहां यूआरएल आरएफसी प्रभाव में '*' एन्कोड करने के लिए यूआरआई आरएफसी आवश्यकता को ओवरराइड करता है। तो जवाब वास्तव में इस बात पर निर्भर करता है कि आप किस प्रकार के यूआरआई बना रहे हैं। – You

+2

'urlencode' और 'java.net.URLEncoder' इंगित करता है कि वह एक यूआरएल के बाद है। – aioobe

2

Javadoc of URLEncoder HTML विनिर्देश को दर्शाता है:।

गु कक्षा में स्ट्रिंग को application/x-www-form-urlencoded एमआईएम प्रारूप में बदलने के लिए स्थिर विधियां हैं। एचटीएमएल फॉर्म एन्कोडिंग के बारे में अधिक जानकारी के लिए, एचटीएमएल विनिर्देश से परामर्श लें।

HTML4 काफी इस सवाल के बारे में स्पष्ट नहीं है और RFC1738, जो aioobe द्वारा उद्धृत किया गया है को संदर्भित करता है:

नियंत्रण के नाम और मान फरार हो रहे हैं। स्पेस कैरेक्टर को '+' द्वारा प्रतिस्थापित किया जाता है, और फिर आरक्षित वर्णों को आरएफसी 1738] में वर्णित किया गया है, खंड 2.2: गैर-अल्फान्यूमेरिक वर्णों को '% एचएच' द्वारा प्रतिस्थापित किया गया है, एक प्रतिशत चिह्न और दो हेक्साडेसिमल अंक ASCII कोड का प्रतिनिधित्व करते हैं चरित्र। लाइन ब्रेक को "सीआर एलएफ" जोड़े के रूप में दर्शाया जाता है (यानी, '% 0 डी% 0 ए')।

हालांकि, HTML5 सीधे कहा गया है कि * इनकोडिंग नहीं किया जाना चाहिए: चरित्र, रेंज U + 0020, U + 002A में नहीं है

  • तो U + 002D, यू + 002E, U + 0030 U + 0039 के लिए, U + 0041 U + 005A, U + 005F, यू करने के लिए + इस प्रकार 0061 के लिए U + 007A
    एक स्ट्रिंग गठन के साथ चरित्र बदलें:
    ...
  • othe राइड
    चरित्र को छोड़ दें।