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.
- 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);
- }
- }
- }
Kopiraj kodo
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. |