Analizar la cadena de consulta es un poco más complicado de lo que parece, dependiendo de cuán indulgente quieras ser.
Primero, la cadena de consulta son bytes ascii. Usted lee estos bytes uno a la vez y los convierte en caracteres. Si el personaje es? o & luego indica el inicio de un nombre de parámetro. Si el carácter es =, entonces señala el inicio de un valor de parámetro. Si el carácter es%, indica el inicio de un byte codificado. Aquí es donde se pone difícil.
Cuando lee en un% char, debe leer los siguientes dos bytes e interpretarlos como dígitos hexadecimales. Eso significa que los siguientes dos bytes serán 0-9, af o AF. Pegue estos dos dígitos hexadecimales para obtener su valor de byte. Pero recuerda, los bytes no son caracteres . Debe saber qué codificación se usó para codificar los caracteres. El carácter é no codifica lo mismo en UTF-8 que en ISO-8859-1. En general, es imposible saber qué codificación se usó para un conjunto de caracteres dado. Siempre uso UTF-8 porque mi sitio web está configurado para servir siempre todo usando UTF-8, pero en la práctica no puede estar seguro. Algunos agentes de usuario le indicarán la codificación de caracteres en la solicitud; puede intentar leer eso si tiene una solicitud HTTP completa. Si solo tienes una url aislada, buena suerte.
De todos modos, suponiendo que está utilizando UTF-8 o alguna otra codificación de caracteres de varios bytes, ahora que ha decodificado un byte codificado, debe dejarlo a un lado hasta que capture el siguiente byte. Necesita todos los bytes codificados que están juntos porque no puede decodificar url correctamente un byte a la vez. Ponga a un lado todos los bytes que están juntos y luego descifrelos todos a la vez para reconstruir su personaje.
Además, se vuelve más divertido si quieres ser indulgente y tener en cuenta a los agentes de usuario que destruyen las URL. Por ejemplo, algunos clientes de correo web codifican dos cosas. O duplique los caracteres? & = (Por ejemplo:) http://yoursite.com/blah??p1==v1&&p2==v2
. Si desea tratar de resolverlo con gracia, deberá agregar más lógica a su analizador.
getQuery()
y qué desea obtener como salida?