Analiza łańcucha zapytania jest nieco bardziej skomplikowana niż się wydaje, w zależności od tego, jak wybaczający chcesz być.
Po pierwsze, ciąg zapytania to bajty ascii. Odczytujesz te bajty pojedynczo i konwertujesz je na znaki. Jeśli postać jest? lub & a następnie sygnalizuje początek nazwy parametru. Jeśli znak ma wartość =, oznacza to początek wartości parametru. Jeśli znak ma wartość%, oznacza to początek zakodowanego bajtu. Tutaj jest trudniej.
Kiedy czytasz w% char, musisz przeczytać następne dwa bajty i zinterpretować je jako cyfry szesnastkowe. Oznacza to, że następne dwa bajty to 0-9, af lub AF. Sklej te dwie cyfry szesnastkowe, aby uzyskać wartość bajtu. Pamiętaj jednak, że bajty nie są znakami . Musisz wiedzieć, jakie kodowanie zostało użyte do zakodowania znaków. Znak é nie koduje tego samego w UTF-8, jak w ISO-8859-1. Zasadniczo nie można wiedzieć, jakie kodowanie zastosowano dla danego zestawu znaków. Zawsze używam UTF-8, ponieważ moja witryna jest skonfigurowana tak, aby zawsze obsługiwać wszystko przy użyciu UTF-8, ale w praktyce nie możesz być tego pewien. Niektóre programy klienckie podadzą kodowanie znaków w żądaniu; możesz spróbować to przeczytać, jeśli masz pełne żądanie HTTP. Jeśli masz tylko adres URL w izolacji, powodzenia.
W każdym razie, zakładając, że używasz UTF-8 lub innego wielobajtowego kodowania znaków, teraz po odkodowaniu jednego zakodowanego bajtu musisz go odłożyć na bok, aż do przechwycenia następnego bajtu. Potrzebne są wszystkie zakodowane bajty, które są razem, ponieważ nie można poprawnie dekodować adresu URL jeden bajt na raz. Odłóż wszystkie bajty, które są razem, a następnie odkoduj je wszystkie naraz, aby zrekonstruować swoją postać.
Co więcej, staje się bardziej zabawny, jeśli chcesz być łagodny i brać pod uwagę aplikacje klienckie, które zmieniają adresy URL. Na przykład niektórzy klienci poczty internetowej kodują rzeczy podwójnie. Lub podwoj znaki? & = (Na przykład:) http://yoursite.com/blah??p1==v1&&p2==v2
. Jeśli chcesz spróbować z wdziękiem sobie z tym poradzić, musisz dodać więcej logiki do twojego parsera.
getQuery()
i co chcesz uzyskać jako wynik?