A análise da string de consulta é um pouco mais complicada do que parece, dependendo de como você deseja perdoar.
Primeiro, a cadeia de caracteres da consulta é bytes ascii. Você lê esses bytes um de cada vez e os converte em caracteres. Se o personagem é? ou & então sinaliza o início do nome de um parâmetro. Se o caractere for =, ele sinaliza o início de um valor de parâmetro. Se o caractere for%, ele sinaliza o início de um byte codificado. Aqui é onde fica complicado.
Quando você lê um% char, precisa ler os próximos dois bytes e interpretá-los como dígitos hexadecimais. Isso significa que os próximos dois bytes serão 0-9, af ou AF. Cole esses dois dígitos hexadecimais para obter o valor em bytes. Mas lembre-se, bytes não são caracteres . Você precisa saber qual codificação foi usada para codificar os caracteres. O caractere é não codifica o mesmo em UTF-8 como em ISO-8859-1. Em geral, é impossível saber qual codificação foi usada para um determinado conjunto de caracteres. Eu sempre uso UTF-8 porque meu site está configurado para sempre servir tudo usando UTF-8, mas na prática você não pode ter certeza. Alguns user-agents dirão a codificação de caracteres na solicitação; você pode tentar ler isso se tiver uma solicitação HTTP completa. Se você apenas tem um URL isolado, boa sorte.
De qualquer forma, supondo que você esteja usando UTF-8 ou alguma outra codificação de caracteres de vários bytes, agora que você decodificou um byte codificado, você deve separá-lo até capturar o próximo byte. Você precisa de todos os bytes codificados que estão juntos porque não é possível decodificar por URL um byte por vez. Separe todos os bytes que estão juntos e decodifique-os todos de uma vez para reconstruir seu personagem.
Além disso, fica mais divertido se você quiser ser indulgente e prestar contas de agentes de usuários que alteram URLs. Por exemplo, alguns clientes de webmail codificam duas vezes as coisas. Ou dobre os caracteres? & = (Por exemplo:) http://yoursite.com/blah??p1==v1&&p2==v2
. Se você quiser tentar lidar com isso com delicadeza, precisará adicionar mais lógica ao seu analisador.
getQuery()
e do que deseja obter como saída?