Розбір рядка запиту дещо складніше, ніж здається, залежно від того, наскільки ви прощаєтесь.
По-перше, рядок запиту - байти 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()
, і що ви хочете отримати як вихід?