Das Parsen der Abfragezeichenfolge ist etwas komplizierter als es scheint, je nachdem, wie verzeihend Sie sein möchten.
Erstens ist die Abfragezeichenfolge ASCII-Bytes. Sie lesen diese Bytes einzeln ein und konvertieren sie in Zeichen. Ist der Charakter? oder & dann signalisiert es den Start eines Parameternamens. Wenn das Zeichen = ist, signalisiert es den Beginn eines Parameterwerts. Wenn das Zeichen% ist, signalisiert es den Beginn eines codierten Bytes. Hier wird es schwierig.
Wenn Sie ein% char einlesen, müssen Sie die nächsten zwei Bytes lesen und sie als hexadezimale Ziffern interpretieren. Das bedeutet, dass die nächsten zwei Bytes 0-9, af oder AF sind. Kleben Sie diese beiden hexadezimalen Ziffern zusammen, um Ihren Bytewert zu erhalten. Aber denken Sie daran, Bytes sind keine Zeichen . Sie müssen wissen, mit welcher Codierung die Zeichen codiert wurden. Das Zeichen é codiert in UTF-8 nicht dasselbe wie in ISO-8859-1. Im Allgemeinen ist es unmöglich zu wissen, welche Codierung für einen bestimmten Zeichensatz verwendet wurde. Ich verwende immer UTF-8, da meine Website so konfiguriert ist, dass immer alles mit UTF-8 bereitgestellt wird, aber in der Praxis können Sie nicht sicher sein. Einige Benutzeragenten teilen Ihnen die Zeichencodierung in der Anforderung mit. Sie können versuchen, dies zu lesen, wenn Sie eine vollständige HTTP-Anfrage haben. Wenn Sie nur eine URL isoliert haben, viel Glück.
Angenommen, Sie verwenden UTF-8 oder eine andere Mehrbyte-Zeichencodierung. Nachdem Sie ein codiertes Byte decodiert haben, müssen Sie es beiseite legen, bis Sie das nächste Byte erfassen. Sie benötigen alle codierten Bytes, die zusammen sind, da Sie nicht jeweils ein Byte richtig url-decodieren können. Legen Sie alle Bytes beiseite, die zusammen sind, und dekodieren Sie sie alle gleichzeitig, um Ihren Charakter zu rekonstruieren.
Außerdem macht es mehr Spaß, wenn Sie nachsichtig sein und Benutzeragenten berücksichtigen möchten, die URLs entstellen. Beispielsweise codieren einige Webmail-Clients Dinge doppelt. Oder verdoppeln Sie die Zeichen? & = (Zum Beispiel :) http://yoursite.com/blah??p1==v1&&p2==v2
. Wenn Sie versuchen möchten, mit diesem Problem ordnungsgemäß umzugehen, müssen Sie Ihrem Parser mehr Logik hinzufügen.
getQuery()
und was Sie als Ausgabe erhalten möchten?