Pažvelkime į šiuos du URL, ar jie perduoda tuos pačius parametrus? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Atrodo, kad skiriasi, bet iš tikrųjų jie visi naudoja UrlEncode ".net technologijai", tačiau vienas yra GB2312 kodavimas, o kitas yra Utf-8 kodavimas. Šis kodas gali gauti aukščiau nurodytą kodavimo efektą:
eilutė tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); eilutė tmp2 = System.Web.HttpUtility.UrlEncode(".net technologija", System.Text.Encoding.UTF8);
Mūsų tikrieji tinklalapiai gali būti iškviesti kitomis programomis. Pavyzdžiui, supaprastinta kinų kalba operacinės sistemos ASP puslapyje turi perduoti kinų kalbos parametrą ASP.net puslapiui. Pagal numatytuosius nustatymus Kinijos supaprastintose operacinėse sistemose ASP Server.UrlEncode metodas koduos kinų kalbą su GB2312 kodavimu. Tačiau pagal numatytuosius nustatymus ASP.net puslapiai yra užkoduoti UTF-8. Tokiu atveju, kai naudosite Request.QueryString["Tag"] reikšmei priimti, negalėsite priimti kiniškos informacijos, o žingsnis po žingsnio derindami matysite iškraipytus simbolius. Šiuo metu, nors Request.QueryString["Tag"] yra priimtas su iškraipytais simboliais, URL šiuo metu nėra iškraipytas.
Sprendimas yra patiems išanalizuoti URL parametrus, o tada iššifruoti parametrų reikšmes pagal GB2312 kodavimą, o ne naudoti numatytąjį .net UTF-8 kodavimą. Tiesą sakant, "Microsoft" panašiai teikia atitinkamas funkcijas, todėl mums nereikia naudoti reguliariųjų išraiškų, kad galėtume patys analizuoti URL eilutes.
Demonstracinis kodas yra toks:
eilutė q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Žyma"]);
Panaudokime Lutz Roeder .NET reflektorių, kad pažvelgtume į System.Web.HttpUtility.ParseQueryString metodo įgyvendinimą: Jei nuolat tikrinsime, pamatysime, kad kodas, kuris galiausiai tvarko URL parametrų eilutės analizę, yra toks:
Ši System.Web.HttpValueCollection klasės funkcija įgyvendina URL parametro analizę Čia matome, kad tai yra kiekvieno veikėjo atlikta analizė.
Kalbant apie tai, kokį kodavimo metodą mums perduoda kita šalis, geriausia jį perduoti kaip parametrą, kad galėtume jį iššifruoti pagal šį vartotojo parametrą. |