Ne kadar affetmek istediğinize bağlı olarak, sorgu dizesini ayrıştırmak göründüğünden biraz daha karmaşıktır.
İlk olarak, sorgu dizesi ascii bayttır. Bu baytları teker teker okursunuz ve karakterlere dönüştürüyorsunuz. Karakter ise? veya & sonra bir parametre adının başlangıcını işaret eder. Karakter = ise, bir parametre değerinin başlangıcını işaret eder. Karakter% ise, kodlanmış bir baytın başlangıcını işaret eder. İşte burada zorlaşıyor.
Bir% char içinde okuduğunuzda, sonraki iki baytı okumanız ve onaltılık basamak olarak yorumlamanız gerekir. Bu, sonraki iki baytın 0-9, af veya AF olacağı anlamına gelir. Bayt değerinizi elde etmek için bu iki onaltılık haneyi birbirine yapıştırın. Ancak unutmayın, baytlar karakter değildir . Karakterleri kodlamak için hangi kodlamanın kullanıldığını bilmelisiniz. É karakteri UTF-8'de ISO-8859-1'de olduğu gibi kodlamaz. Genel olarak, belirli bir karakter seti için hangi kodlamanın kullanıldığını bilmek imkansızdır. Her zaman UTF-8 kullanıyorum çünkü web sitem her zaman UTF-8 kullanarak her şeye hizmet verecek şekilde yapılandırıldı, ancak pratikte emin olamıyorsunuz. Bazı kullanıcı aracıları size istekte karakter kodlamasını söyleyecektir; tam bir HTTP isteğiniz varsa bunu okumaya çalışabilirsiniz. Yalnız bir url'niz varsa, iyi şanslar.
Her neyse, UTF-8 veya başka bir çok baytlık karakter kodlaması kullandığınızı varsayarsak, şimdi bir kodlanmış bayt kodunu çözdüğünüze göre, bir sonraki baytı yakalayana kadar bir kenara koymanız gerekir. Bir arada kodlanmış baytlara ihtiyacınız vardır, çünkü bir seferde bir bayt düzgün şekilde çözemezsiniz. Birlikte olan tüm baytları bir kenara koyun ve karakterinizi yeniden yapılandırmak için hepsini bir kerede kodunu çözün.
Ayrıca, esnek olmak ve url'leri yöneten kullanıcı aracılarını hesaba katmak istiyorsanız daha eğlenceli olur. Örneğin, bazı web posta istemcileri bir şeyleri iki kez kodlar. Veya? & = Karakterleri ikiye katlayın (örneğin:) http://yoursite.com/blah??p1==v1&&p2==v2
. Bununla zarif bir şekilde uğraşmak istiyorsanız, ayrıştırıcıya daha fazla mantık eklemeniz gerekir.
getQuery()
ve çıktı olarak ne almak istiyorsunuz?