Poglejmo si naslednja dva URL-ja, ali prenašata enake parametre? aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.net%e6%8a%80%e6%9c%af
Zdi se, da je drugače, a v resnici vsi uporabljajo UrlEncode za ".net tehnologijo", eden pa je kodiranje GB2312, drugi pa Utf-8. Naslednja koda lahko doseže zgornji učinek kodiranja:
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 dejanske spletne strani lahko kličejo tudi drugi programi. Na primer, pri Chinese Simplified mora ASP stran v operacijskem sistemu posredovati kitajski parameter na ASP.net stran. Privzeto na kitajskih poenostavljenih operacijskih sistemih ASP-jeva metoda Server.UrlEncode kodira kitajščino z GB2312 kodiranjem. Vendar so privzeto ASP.net strani kodirane v UTF-8. V tem primeru, ko uporabite Request.QueryString["Tag"] za sprejem vrednosti, ne boste mogli sprejeti kitajskih informacij in boste videli popačene znake pri korak-po-koraku odpravljanju napak. Trenutno, čeprav je Request.QueryString["Tag"] sprejet z nerazumljenimi znaki, URL trenutno ni popačen.
Rešitev je, da parametre v URL-ju analizirate sami, nato pa dešifrirate vrednosti parametrov glede na kodiranje GB2312, namesto da uporabite privzeto UTF-8 kodiranje .net. Pravzaprav Microsoft prav tako ponuja ustrezne funkcije, tako da nam ni treba uporabljati regularnih izrazov za analizo URL nizov sami.
Demo koda je naslednja:
string q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.write(nv["tag"]);
Uporabimo Lutz Roederjev .NET Reflector za pregled implementacije metode System.Web.HttpUtility.ParseQueryString: Če še naprej preverjamo, lahko vidimo, da je koda, ki na koncu obravnava analizo niza parametrov URL, naslednja:
Naslednja funkcija razreda System.Web.HttpValueCollection izvaja razčlenjevanje parametra URL Tukaj vidimo, da gre za analizo, ki jo opravi vsak lik.
Kar zadeva, kakšno metodo kodiranja nam posreduje druga stran, je najbolje, da jo posredujemo kot parameter, da jo lahko dešifriramo glede na ta parameter uporabnika. |