Разбор строки запроса немного сложнее, чем кажется, в зависимости от того, насколько вы прощаете.
Во-первых, строка запроса - это байты ascii. Вы читаете эти байты по одному и конвертируете их в символы. Если персонаж есть? или & затем он сигнализирует о начале имени параметра. Если символ =, то это означает начало значения параметра. Если символ%, то он сигнализирует о начале закодированного байта. Вот где это становится сложным.
Когда вы читаете в% char, вы должны прочитать следующие два байта и интерпретировать их как шестнадцатеричные цифры. Это означает, что следующие два байта будут 0-9, af или AF. Склейте эти две шестнадцатеричные цифры вместе, чтобы получить значение в байтах. Но помните, байты не являются символами . Вы должны знать, какая кодировка использовалась для кодирования символов. Символ é не кодирует то же самое в UTF-8, как в ISO-8859-1. Вообще невозможно знать, какая кодировка использовалась для данного набора символов. Я всегда использую UTF-8, потому что мой веб-сайт настроен так, чтобы всегда обслуживать все, используя UTF-8, но на практике вы не можете быть уверены. Некоторые пользовательские агенты сообщат вам кодировку символов в запросе; Вы можете попытаться прочитать это, если у вас есть полный HTTP-запрос. Если у вас просто есть URL-адрес в изоляции, удачи.
В любом случае, если вы используете кодировку UTF-8 или какую-либо другую многобайтовую кодировку символов, теперь, когда вы декодировали один закодированный байт, вам нужно отложить его до тех пор, пока вы не захватите следующий байт. Вам нужны все закодированные байты, потому что вы не можете правильно декодировать url по одному байту за раз. Отложите все вместе взятые байты, а затем декодируйте их все сразу, чтобы восстановить своего персонажа.
Кроме того, вам будет веселее, если вы хотите быть снисходительным и учитывать учетные записи пользователей, которые изменяют URL-адреса. Например, некоторые клиенты веб-почты дважды кодируют вещи. Или удвойте символы? & = (Например:) http://yoursite.com/blah??p1==v1&&p2==v2
. Если вы хотите попытаться изящно справиться с этим, вам нужно будет добавить больше логики в ваш парсер.
getQuery()
, и что вы хотите получить в качестве результата?