Pozrime sa na nasledujúce dve URL, prechádzajú rovnakými parametrami? aaa.aspx?tag=.net%bc%c%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Zdá sa, že je to iné, ale v skutočnosti všetky používajú UrlEncode pre ".net technológiu", pričom jedno je kódovanie GB2312 a druhé Utf-8. Nasledujúci kód môže dosiahnuť vyššie uvedený kódovací efekt:
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);
Naše skutočné webové stránky môžu byť volané inými programami. Napríklad Chinese Simplified ASP stránka v operačnom systéme musí odovzdať čínsky parameter na ASP.net stránku. Štandardne na čínskych zjednodušených operačných systémoch metóda Server.UrlEncode od ASP kóduje čínštinu s kódovaním GB2312. Ale v predvolenom nastavení sú ASP.net stránky zakódované v UTF-8. V takom prípade, keď použijete Request.QueryString["Tag"] na prijatie hodnoty, nebudete môcť prijať čínske informácie a pri postupnom ladení uvidíte nezrozumiteľné znaky. V tomto čase, hoci je Request.QueryString["Tag"] akceptovaný s nezrozumiteľnými znakmi, URL adresa v tomto čase nie je skreslená.
Riešením je analyzovať parametre v URL sami a potom dešifrovať hodnoty parametrov podľa kódovania GB2312, namiesto použitia predvoleného UTF-8 kódovania .net. V skutočnosti Microsoft podobne poskytuje zodpovedajúce funkcie, takže nemusíme sami používať regulárne výrazy na analýzu URL reťazcov.
Demo kód je nasledovný:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.write(nv["tag"]);
Použime Lutz Roederov .NET Reflector na preskúmanie implementácie metódy System.Web.HttpUtility.ParseQueryString: Ak to budeme kontrolovať späť, vidíme, že kód, ktorý nakoniec spracováva analýzu reťazcov URL parametrov, je nasledovný:
Nasledujúca funkcia triedy System.Web.HttpValueCollection implementuje parsovanie parametra URL Tu vidíme, že ide o analýzu vykonanú každou postavou.
Čo sa týka spôsobu kódovania, ktorý nám druhá strana odovzdá, je najlepšie ho odovzdať ako parameter, aby sme ho mohli dešifrovať podľa tohto parametra používateľa. |