क्वेरी स्ट्रिंग को पार्स करना थोड़ा अधिक जटिल है जितना लगता है कि यह इस बात पर निर्भर करता है कि आप कितना क्षमा चाहते हैं।
सबसे पहले, क्वेरी स्ट्रिंग ascii बाइट्स है। आप एक बार में इन बाइट्स में पढ़ते हैं और उन्हें वर्णों में बदलते हैं। अगर चरित्र है? या फिर यह एक पैरामीटर नाम की शुरुआत का संकेत देता है। यदि वर्ण = है, तो यह एक परमार्थ मूल्य की शुरुआत का संकेत देता है। यदि चरित्र% है तो यह एन्कोडेड बाइट की शुरुआत का संकेत देता है। यहाँ है जहाँ यह मुश्किल हो जाता है।
जब आप एक% चार में पढ़ते हैं तो आपको अगले दो बाइट्स को पढ़ना होगा और उन्हें हेक्स अंकों के रूप में व्याख्या करना होगा। इसका मतलब है कि अगले दो बाइट 0-9, एफएफ या एएफ होंगे। अपने बाइट मान को पाने के लिए इन दो हेक्स अंकों को एक साथ गोंद दें। लेकिन याद रखें, बाइट्स अक्षर नहीं हैं । आपको यह जानना होगा कि वर्णों को एन्कोड करने के लिए एन्कोडिंग का क्या उपयोग किया गया था। यह चरित्र UTF-8 में समान नहीं है, क्योंकि यह ISO-8859-1 में है। सामान्य तौर पर यह जानना असंभव है कि किसी दिए गए वर्ण सेट के लिए एन्कोडिंग का उपयोग किया गया था। मैं हमेशा यूटीएफ -8 का उपयोग करता हूं क्योंकि मेरी वेब साइट को यूटीएफ -8 का उपयोग करके हमेशा सब कुछ परोसने के लिए कॉन्फ़िगर किया गया है लेकिन व्यवहार में आप निश्चित नहीं हो सकते। कुछ उपयोगकर्ता-एजेंट आपको अनुरोध में वर्ण एन्कोडिंग बताएंगे; आप यह पढ़ने की कोशिश कर सकते हैं कि यदि आपके पास पूर्ण HTTP अनुरोध है। यदि आपके पास अलगाव में एक यूआरएल है, तो शुभकामनाएं।
वैसे भी, यह मानकर कि आप UTF-8 या किसी अन्य मल्टी-बाइट कैरेक्टर एन्कोडिंग का उपयोग कर रहे हैं, अब जब आपने एक एन्कोडेड बाइट को डिकोड कर लिया है, तो आपको इसे तब तक सेट करना होगा जब तक कि आप अगली बाइट पर कब्जा न कर लें। आपको सभी एन्कोडेड बाइट्स की आवश्यकता होती है जो एक साथ हैं क्योंकि आप एक बार में एक बाइट को ठीक से url-decode नहीं कर सकते हैं। एक साथ सभी बाइट्स को अलग सेट करें और फिर अपने चरित्र को फिर से बनाने के लिए उन सभी को एक साथ डिकोड करें।
इसके अलावा और अधिक मज़ा आता है अगर आप कर्ज़दार होना चाहते हैं और उपयोगकर्ता-एजेंटों के लिए खाता है जो उरल्स का प्रबंधन करते हैं। उदाहरण के लिए, कुछ वेबमेल क्लाइंट चीजों को डबल-एनकोड करते हैं। या डबल अप करें? & = Chars (उदाहरण के लिए:) http://yoursite.com/blah??p1==v1&&p2==v2
। यदि आप इससे निपटने का प्रयास करना चाहते हैं, तो आपको अपने पार्सर में अधिक तर्क जोड़ने होंगे।
getQuery()
, और क्या आप आउटपुट के रूप में प्राप्त करना चाहते हैं?