Katsotaanpa seuraavia kahta URL-osoitetta, läpäisevätkö ne samat parametrit? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Vaikuttaa erilaiselta, mutta itse asiassa kaikki käyttävät UrlEncodea ".net-teknologiaan", mutta toinen on GB2312-koodaus ja toinen Utf-8-koodaus. Seuraava koodi voi saada yllä olevan koodausvaikutuksen:
string tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); merkkijono tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Verkkosivumme voivat olla muilla ohjelmilla. Esimerkiksi kiinan yksinkertaistettu ASP-sivu käyttöjärjestelmässä tarvitsee kiinan parametrin ASP.net sivulle. Oletuksena kiinalaisissa yksinkertaistetuissa käyttöjärjestelmissä ASP:n Server.UrlEncode-menetelmä koodaa kiinan GB2312-koodauksella. Mutta oletuksena ASP.net sivut koodataan UTF-8:lla. Tässä tapauksessa, kun käytät Request.QueryString["Tag"] hyväksyäksesi arvon, et voi hyväksyä kiinalaista tietoa, ja näet vaiheittaisessa virheenkorjauksessa sekavia merkkejä. Tällä hetkellä, vaikka Request.QueryString["Tag"] hyväksytään sekavilla merkeillä, URL-osoite ei tällä hetkellä ole sekava.
Ratkaisu on analysoida URL-osoitteen parametrit itse ja purkaa parametrien arvot GB2312-koodauksen mukaisesti sen sijaan, että käyttäisit .netin oletus-UTF-8-koodausta. Itse asiassa Microsoft tarjoaa vastaavat funktiot, joten meidän ei tarvitse käyttää säännöllisiä lausekkeita analysoidaksemme URL-merkkijonoja itse.
Demokoodi on seuraava:
merkkijono q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Käytetään Lutz Roederin .NET Reflectoria tarkastellaksemme System.Web.HttpUtility.ParseQueryString-menetelmän toteutusta: Jos jatkamme tarkistamista, näemme, että koodi, joka lopulta hoitaa URL-parametrin merkkijonoanalyysin, on seuraava:
System.Web.HttpValueCollection-luokan seuraava funktio toteuttaa URL-parametrin jäsentämisen Tässä näemme, että jokainen hahmo tekee analyysin.
- 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);
- }
- }
- }
Kopioi koodi
Mitä tulee siihen, millaisen koodausmenetelmän toinen osapuoli meille välittää, on parasta välittää se parametrina, jotta voimme purkaa sen käyttäjän parametrin mukaan. |