Låt oss titta på följande två URL:er, skickar de samma parametrar? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Det verkar vara annorlunda, men faktiskt använder de alla UrlEncode för ".net-teknologi", men den ena är GB2312-kodning och den andra är Utf-8-kodning. Följande kod kan uppnå ovanstående kodningseffekt:
sträng tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); sträng tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Våra webbplatser kan kallas av andra program. Till exempel behöver en ASP-sida i operativsystemet Kinesisk förenklad en kinesisk parameter till en ASP.net sida. Som standard, på kinesiska förenklade operativsystem, kommer ASP:s Server.UrlEncode-metod att koda kinesiska med GB2312-kodning. Men som standard är ASP.net sidor kodade i UTF-8. I detta fall, när du använder Request.QueryString["Tag"] för att acceptera värdet, kommer du inte att kunna acceptera kinesisk information, och du kommer att se förvrängda tecken i steg-för-steg-felsökning. För tillfället, även om Request.QueryString["Tag"] accepteras med oförvrängda tecken, är URL:en för tillfället inte förvrängd.
Lösningen är att analysera parametrarna i URL:en själv och sedan dekryptera parametrarnas värden enligt kodningen av GB2312, istället för att använda standardkodningen för .UTF-8. Faktum är att Microsoft på liknande sätt tillhandahåller motsvarande funktioner, så vi behöver inte använda reguljära uttryck för att analysera URL-strängar själva.
Demokoden är följande:
string q = Request.Url.Query;
System.Collections.Specialiserad.NamnVärdeCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Låt oss använda Lutz Roeders .NET Reflector för att titta på implementeringen av System.Web.HttpUtility.ParseQueryString-metoden: Om vi fortsätter att kolla kan vi se att koden som slutligen hanterar URL-parametersträngsanalysen är följande:
Följande funktion i System.Web.HttpValueCollection-klassen implementerar parsning av URL-parametern Här ser vi att det är en analys utförd av varje karaktär.
När det gäller vilken typ av kodningsmetod den andra parten ger oss, är det bäst att skicka den som en parameter, så att vi kan dekryptera den enligt användarens parameter. |