Lad os se på følgende to URL'er, overfører de de samme parametre? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Det virker anderledes, men faktisk bruger de alle UrlEncode til ".net-teknologi", men den ene er GB2312-kodning og den anden er Utf-8-kodning. Følgende kode kan opnå ovenstående kodningseffekt:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); streng tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Vores hjemmesider kan blive kaldt af andre programmer. For eksempel skal en ASP-side på operativsystemet i kinesisk forenklet en kinesisk parameter til en ASP.net side. Som standard vil ASP's Server.UrlEncode-metode på kinesiske forenklede operativsystemer kode kinesisk med GB2312-kodning. Men som standard er ASP.net sider kodet i UTF-8. I dette tilfælde, når du bruger Request.QueryString["Tag"] til at acceptere værdien, vil du ikke kunne acceptere kinesisk information, og du vil se forvrængede tegn i trin-for-trin fejlfinding. På nuværende tidspunkt, selvom Request.QueryString["Tag"] accepteres med forvanskede tegn, er URL'en på nuværende tidspunkt ikke forvansket.
Løsningen er selv at analysere parametrene i URL'en og derefter dekryptere værdierne af parametrene i henhold til kodningen i GB2312, i stedet for at bruge standard UTF-8-kodningen fra .net. Faktisk tilbyder Microsoft tilsvarende funktioner, så vi behøver ikke selv at bruge regulære udtryk til at analysere URL-strenge.
Demokoden er som følger:
streng q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Lad os bruge Lutz Roeders .NET Reflector til at se på implementeringen af System.Web.HttpUtility.ParseQueryString-metoden: Hvis vi bliver ved med at tjekke igen, kan vi se, at koden, der til sidst håndterer URL-parameterstrengsanalysen, er som følger:
Følgende funktion i System.Web.HttpValueCollection-klassen implementerer parsing af URL-parameteren Her ser vi, at det er en analyse udført af hver karakter.
- internal void FillFromString(string s, bool urlencoded, Encoding encoding)
- {
- int num1 = (s != null) ? s.Length : 0;
- for (int num2 = 0; num2 < num1; num2++)
- {
- int num3 = num2;
- int num4 = -1;
- while (num2 < num1)
- {
- switch (s[num2])
- {
- case ’=’:
- if (num4 < 0)
- {
- num4 = num2;
- }
- break;
- }
- num2++;
- }
- string text1 = null;
- string text2 = null;
- if (num4 >= 0)
- {
- text1 = s.Substring(num3, num4 - num3);
- text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
- }
- else
- {
- text2 = s.Substring(num3, num2 - num3);
- }
- if (urlencoded)
- {
- base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
- }
- else
- {
- base.Add(text1, text2);
- }
- if ((num2 == (num1 - 1)) && (s[num2] == ’&’))
- {
- base.Add(null, string.Empty);
- }
- }
- }
Kopier kode
Hvad angår hvilken slags kodningsmetode den anden part giver os, er det bedst at sende den som en parameter, så vi kan dekryptere den i henhold til brugerens parameter. |