La oss se på de to følgende URL-ene, gir de de samme parameterne? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Det virker annerledes, men faktisk bruker de alle UrlEncode for ".net-teknologi", men den ene er GB2312-koding og den andre er Utf-8-koding. Følgende kode kan oppnå den ovennevnte kodingseffekten:
streng tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); streng tmp2 = System.Web.HttpUtility.UrlEncode(".net-teknologi", System.Text.Encoding.UTF8);
Våre egne nettsider kan bli kalt av andre programmer. For eksempel må en ASP-side på operativsystemet i kinesisk forenklet en kinesisk parameter til en ASP.net side. Som standard vil ASPs Server.UrlCode-metode på kinesiske forenklede operativsystemer kode kinesisk med GB2312-koding. Men som standard er ASP.net sider kodet i UTF-8. I dette tilfellet, når du bruker Request.QueryString["Tag"] for å akseptere verdien, vil du ikke kunne akseptere kinesisk informasjon, og du vil se utydelige tegn i trinnvis feilsøking. For øyeblikket, selv om Request.QueryString["Tag"] aksepteres med utydelige tegn, er ikke URL-en på nåværende tidspunkt utydelig.
Løsningen er å analysere parameterne i URL-en selv, og deretter dekryptere verdiene til parameterne i henhold til kodingen til GB2312, i stedet for å bruke standard UTF-8-koding fra .net. Faktisk tilbyr Microsoft tilsvarende funksjoner, så vi slipper å bruke regulære uttrykk for å analysere URL-strenger selv.
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"]);
La oss bruke Lutz Roeders .NET Reflector for å se på implementeringen av System.Web.HttpUtility.ParseQueryString-metoden: Hvis vi fortsetter å sjekke, kan vi se at koden som til slutt håndterer URL-parameterstrenganalysen er som følger:
Følgende funksjon i System.Web.HttpValueCollection-klassen implementerer parsing av URL-parameteren Her ser vi at det er en analyse utført av 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 koden
Når det gjelder hvilken type kodingsmetode den andre parten gir oss, er det best å sende den som en parameter, slik at vi kan dekryptere den i henhold til denne parameteren til brukeren. |