Schauen wir uns die folgenden beiden URLs an: Geben sie die gleichen Parameter aus? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Es scheint anders zu sein, aber tatsächlich verwenden sie alle UrlEncode für ".net-Technologie", wobei einer GB2312-Codierung und der andere Utf-8-Codierung ist. Der folgende Code kann den oben genannten Codierungseffekt erzielen:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); string tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Unsere Webseiten können von anderen Programmen aufgerufen werden. Zum Beispiel muss eine ASP-Seite auf dem Betriebssystem in Chinesisch vereinfacht einen chinesischen Parameter an eine ASP.net Seite übergeben. Standardmäßig kodiert auf chinesischen vereinfachten Betriebssystemen die Server.UrlCode-Methode von ASP das Chinesische mit GB2312-Codierung. Aber standardmäßig sind ASP.net Seiten in UTF-8 codiert. In diesem Fall können Sie, wenn Sie Request.QueryString["Tag"] verwenden, um den Wert zu akzeptieren, keine chinesischen Informationen mehr akzeptieren, und Sie werden beim Schritt-für-Schritt-Debugging verzerrte Zeichen sehen. Derzeit wird Request.QueryString["Tag"] zwar mit verzerrten Zeichen akzeptiert, aber die URL ist derzeit nicht verzerrt.
Die Lösung besteht darin, die Parameter in der URL selbst zu analysieren und dann die Werte der Parameter gemäß der Codierung von GB2312 zu entschlüsseln, anstatt die Standard-UTF-8-Codierung von .net zu verwenden. Tatsächlich stellt Microsoft ähnlich entsprechende Funktionen bereit, sodass wir keine regulären Ausdrücke verwenden müssen, um URL-Strings selbst zu analysieren.
Der Democode ist wie folgt:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Verwenden wir Lutz Roeders .NET Reflector, um die Implementierung der System.Web.HttpUtility.ParseQueryString-Methode zu betrachten: Wenn wir immer wieder nachsehen, sehen wir, dass der Code, der schließlich die Analyse der URL-Parameter-Strings verarbeitet, wie folgt ist:
Die folgende Funktion der System.Web.HttpValueCollection-Klasse implementiert das Parsing des URL-Parameters Hier sehen wir, dass es sich um eine Analyse handelt, die von jeder Figur durchgeführt wird.
Was die Art von Codierungsmethode betrifft, die die andere Partei uns übergibt, ist es am besten, sie als Parameter weiterzugeben, damit wir sie entsprechend diesem Parameter des Benutzers entschlüsseln können. |